我有一个如下所示的数据框:
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
但我不知道如何使用它来索引原始数据帧。
任何帮助表示感谢。
答案 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?
如果您的意思是u1
和u3
,那么有很多方法可以实现这一目标:
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