2016-02-01 72 views
3

我希望能夠使用多級標準(邏輯AND加入標準)從多索引數據框對象中刪除行。根據級別之間的'AND'條件刪除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'])) 

print(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()方法完成。 A「迂迴」的方式,其給出正確的結果是要做到:

df = pd.concat([df.drop(labels='A',level=0),df.drop(labels='a',level=1)]) 
df = df.drop_duplicates() 

但我估計,必須有一個更好的辦法...

回答

3

爲了解決你的問題就.drop() - 只是通過MultiIndex標籤爲tuple

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

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

你可以使用isin方法索引,並採取相反你有什麼用~選擇:

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解決方案的性能下降幾乎是前者的3倍。