簡體   English   中英

使用多個MultiIndex級別刪除

[英]Drop using several MultiIndex levels

我有一個這樣的MultiIndexed數據框:

      foo
c b a
p 6 1 3.0
q 7 2 2.3
r 8 3 1.0
s 9 4 100.0

我可以使用前n MultiIndex級別使用drop擺脫幾行:

>>> x.drop([('p', 6), ('r',8)])
      foo
c b a
q 7 2 2.3
s 9 4 100.0

我也可以從單個級別drop

>>> x.drop([1, 2], level='a')
      foo
c b a
r 8 3 1.0
s 9 4 100.0

但是我似乎無法在多個級別上執行此操作(第一個n除外):

>>> x.drop([(8, 3), (9, 4)], level=['b', 'a'])
Traceback (most recent call last):

  File "<ipython-input-156-a650ded10561>", line 1, in <module>
    x.drop([(8, 3), (9, 4)], level=['b', 'a'])

  File "/usr/lib/python2.7/dist-packages/pandas/core/generic.py", line 1399, in drop
    new_axis = axis.drop(labels, level=level)

  File "/usr/lib/python2.7/dist-packages/pandas/core/index.py", line 2718, in drop
    return self._drop_from_level(labels, level)

  File "/usr/lib/python2.7/dist-packages/pandas/core/index.py", line 2744, in _drop_from_level
    i = self._get_level_number(level)

  File "/usr/lib/python2.7/dist-packages/pandas/core/index.py", line 2199, in _get_level_number
    raise KeyError('Level %s not found' % str(level))

KeyError: "Level ['b', 'a'] not found"

這似乎很奇怪,因為xs 確實接受一個級別列表,例如:

>>> df.xs(('baz', 2), level=[0, 'third'])
        A  B  C  D
second
three   5  3  5  3

那么如何從數據框中刪除[(8, 3), (9, 4)] (即第三行和第四行)?

此功能尚不存在,請參閱此問題: https : //github.com/pydata/pandas/pull/6599

您可以執行此操作。

In [19]: mask = df.index.get_level_values

In [20]: df.loc[~(mask('b').isin([8,9]) & mask('a').isin([3,4]))]
Out[20]: 
       foo
c b a     
p 6 1  3.0
q 7 2  2.3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM