簡體   English   中英

按 MultiIndex Pandas DataFrame 中的列進行子選擇

[英]Subselect by columns in MultiIndex Pandas DataFrame

我有一個看起來像這樣的數據框:

               u1  u2  u3  u4  u5  u6
level0 level1                        
foo1   x1       0   1   0   0   0   0
       x2       0   1   1   0   1   1
foo2   x3       0   1   0   1   0   1
       x4       1   0   0   0   1   1
foo3   x5       1   0   1   0   0   0
       x6       0   1   1   1   0   0
foo4   x7       1   0   0   1   0   1
       x8       0   1   1   1   0   0

我只想子選擇那些u3==1索引。 所以,作為輸出,我應該得到類似的東西:

               u1  u2  u3  u4  u5  u6
level0 level1                        
foo1   
       x2       0   1   1   0   1   1
foo2   

foo3   x5       1   0   1   0   0   0
       x6       0   1   1   1   0   0
foo4   
       x8       0   1   1   1   0   0

我試過這樣做:

idx  = pd.IndexSlice
df.loc[idx[:,:],'u2']==1

這使:

level0  level1
foo1    x1         True
        x2         True
foo2    x3         True
        x4        False
foo3    x5        False
        x6         True
foo4    x7        False
        x8         True

但我不知道如何使用它來索引原始數據框。

任何幫助表示贊賞。

您可以使用query()方法或常規布爾索引

In [11]: df.query('u2 == 1')
Out[11]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo1   x1       0   1   0   0   0   0
       x2       0   1   1   0   1   1
foo2   x3       0   1   0   1   0   1
foo3   x6       0   1   1   1   0   0
foo4   x8       0   1   1   1   0   0

In [12]: df.loc[df['u2'] == 1]
Out[12]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo1   x1       0   1   0   0   0   0
       x2       0   1   1   0   1   1
foo2   x3       0   1   0   1   0   1
foo3   x6       0   1   1   1   0   0
foo4   x8       0   1   1   1   0   0

使用.query()方法還允許您按索引級別進行搜索:

In [17]: df.query("level0 in ['foo2','foo3'] and u2 == 1")
Out[17]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo2   x3       0   1   0   1   0   1
foo3   x6       0   1   1   1   0   0

更新:

我怎樣才能選擇所有的你? 其中 x1==1 和 x3==1?

如果你的意思是u1u3那么有很多方法可以實現:

In [8]: df.query("u1 == 1 and u3 == 1")
Out[8]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo3   x5       1   0   1   0   0   0

In [9]: df.loc[(df['u1'] == 1) & (df['u3'] == 1)]
Out[9]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo3   x5       1   0   1   0   0   0

In [10]: df.loc[df[['u1','u3']].eq(1).all(1)]
Out[10]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo3   x5       1   0   1   0   0   0

暫無
暫無

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

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