Python 基于';删除数据帧的多索引行;和';层间条件

Python 基于';删除数据帧的多索引行;和';层间条件,python,pandas,multi-index,Python,Pandas,Multi Index,我希望能够使用多个级别的条件(使用逻辑和连接条件)从多索引数据帧对象中删除行 考虑以下给出的pandas dataframe对象: import pandas as pd df = pd.DataFrame(data = [[1,'x'],[2,'x'],[1,'y'],[2,'y']], index=pd.MultiIndex(levels=[['A','B'],['a','b']],

我希望能够使用多个级别的条件(使用逻辑和连接条件)从多索引数据帧对象中删除行

考虑以下给出的pandas dataframe对象:

import pandas as pd
df = pd.DataFrame(data = [[1,'x'],[2,'x'],[1,'y'],[2,'y']],
                   index=pd.MultiIndex(levels=[['A','B'],['a','b']],
                                       labels=[[0,1,0,1],[0,1,1,0]],
                                       names=['idx0','idx1']))
打印(df)
输出:

           0  1
idx0 idx1      
A    a     1  x
B    b     2  x
A    b     1  y
B    a     2  y
我希望消除
'idx0'=='A'
'idx1'=='A'
中的行,因此最终结果是:

           0  1
idx0 idx1      
B    b     2  x
     a     2  y
A    b     1  y
在我看来,使用
df.drop()
方法似乎无法做到这一点。给出正确结果的“迂回”方法是:

df = pd.concat([df.drop(labels='A',level=0),df.drop(labels='a',level=1)])
df = df.drop_duplicates()
但我认为必须有一个更好的方法…

您可以使用索引方法,并与您使用
~
选择的内容相反:

In [85]: df.index.isin([('A','a')])
Out[85]: array([ True, False, False, False], dtype=bool)

In [86]: df[~df.index.isin([('A','a')])]
Out[86]:
           0  1
idx0 idx1
B    b     2  x
A    b     1  y
B    a     2  y
计时:

In [95]: %timeit df.drop(('A','a'))
1000 loops, best of 3: 1.33 ms per loop

In [96]: %timeit df[~df.index.isin([('A','a')])]
1000 loops, best of 3: 457 us per loop

因此,使用
isin
解决方案时,drop的速度几乎慢了3倍。

要解决有关
的问题,drop()
-只需将
多索引
标签作为
元组传递即可:

df.drop(('A', 'a'))

           0  1
idx0 idx1      
B    b     2  x
A    b     1  y
B    a     2  y