我正在尝试为上述问题找到一个很好的,全面的答案。
让我们采用以下数据框:
df = pd.DataFrame(np.random.randn(4,4), columns=['A', 'B', 'C', 'D'])
df['Category'] = pd.Series(['Cat1', 'Cat2', 'Cat1', 'Cat2'])
df:
A B C D Category
0 0.057456 0.462712 -1.245539 0.095947 Cat1
1 0.741688 0.353600 1.130754 -1.692440 Cat2
2 0.638623 -0.109566 0.118509 -0.692661 Cat1
3 -0.905806 0.284818 -0.094696 -1.325617 Cat2
我了解使用df.A
或df['A']
选择列A
并使用df[['A', 'B']]
同时选择列A
和{{1}的基本术语}。
如果我想传递布尔条件,我可以执行类似B
的操作来返回df[df.A > 0]
大于0的行。并且我可以包含多个条件,例如df.A
来包含多个条件。
我没有看到的一件事是,如何选择具有与上面使用的两个布尔条件相同的数据框列的子集。
我尝试过的两种方法都没有成功:
df[(df.A > 0) & (df.Category == 'Cat1')]
这将返回索引中的所有行,而我只希望针对上述条件返回df['B'].where(df.A > 0)
的那些行。
我也尝试使用True
失败,因为它不能在系列中使用。
因此query
返回一条错误消息。
理想情况下,我正在寻找的解决方案具有以下条件:
df['A'].query(some condition)
和df['A']
。df['B']
的行,而不是所有行。谢谢。
答案 0 :(得分:3)
我认为您正在寻找.loc
df.loc[df.A>0,'B']
0 0.462712
1 0.353600
2 -0.109566
Name: B, dtype: float64
df.loc[(df.A>0)&(df.B<0),['B','C']]
B C
2 -0.109566 0.118509
答案 1 :(得分:2)
使用query
只是@W-B's answer的一种变体:
df.query('A > 0 and B < 0').loc[:, ['B', 'C']]
或
df.query('A > 0 and B < 0')[['B', 'C']]
还将打印
B C
2 -0.109566 0.118509
答案 2 :(得分:1)
您正在正确处理df['B'].where(df.A > 0)
条件。但是,仅在其后附加几个功能即可仅实现True
个结果。
具有多个(也可以传递单个)条件的示例:
df[['B','C']].where((df.A > 1) & (df.D>0)).dropna().reset_index(drop=True)