簡體   English   中英

根據級別之間的“AND”條件刪除DataFrame的多索引行

[英]Drop multi-indexed rows of a DataFrame based on 'AND' condition between levels

我希望能夠使用多個級別標准從多索引數據框對象中刪除行(使用邏輯AND加入條件)。

考慮由下面給出的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']))

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()方法完成此操作。 一種給出正確結果的“回旋”方式是:

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

但我認為必須有更好的方法......

要解決有關.drop() - 只需將MultiIndex標簽作為tuple傳遞:

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

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

您可以將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倍。

暫無
暫無

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

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