我正试图为上述问题找到一个非常好的、全面的答案。
让我们采用以下数据框:
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 和 B 两列。
如果我想传递 bool 条件,我可以做 df[df.A > 0] 之类的事情来返回 df.A 大于 0 的行. 我可以包含多个条件,例如 df[(df.A > 0) & (df.Category == 'Cat1')] 以包含多个条件。
但我没有看到的一件事是,我如何选择具有上面使用的相同两个 bool 条件的数据框列的子集。
我尝试过的两种方法都没有成功:
df['B'].where(df.A > 0)
这会返回索引中的所有行,而我只喜欢针对所述条件返回 True 的行。
我也尝试过使用 query 但没有成功,因为它不能用于系列。
因此 df['A'].query(some condition) 返回一条错误消息。
理想情况下,我正在寻找的解决方案具有以下条件:
- 可用于单列或多列。也就是说,您可以同时选择
df['A']和df['B']。 - 如果需要,可以使用多个 bool 条件,而不仅仅是一个。
- 仅返回条件的计算结果为
True的行,而不是所有行。 - 理想情况下语法简单,但如果那不可能,那就这样吧。
谢谢。
请您参考如下方法:
我认为您正在寻找 .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
