在MultiIndex Pandas DataFrame中按列进行子选择

时间:2017-01-19 18:48:09

标签: python 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

但我不知道如何使用它来索引原始数据帧。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用query()方法或常规boolean indexing

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