2017-01-19 101 views
1

列我有一个数据帧,看起来像这样:子选择通过多指标熊猫数据帧

   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

可以使用query()方法或定期boolean indexing:使用.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 

,您还可以通过指数水平搜索:

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 

UPDATE:

如何我可以选择所有的你吗?为什么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 
+0

伟大的答案!非常清楚。快速跟进:我如何选择所有'u1'和'x1 == 1'和'x3 == 1'? – reckoner

+0

非常明确的答案。 – reckoner