如何使用多个布尔条件选择 Pandas DataFrame 中的特定列
Posted
技术标签:
【中文标题】如何使用多个布尔条件选择 Pandas DataFrame 中的特定列【英文标题】:How to Select Specific Columns in Pandas DataFrame Using Multiple Boolean Conditions 【发布时间】:2019-05-25 22:53:15 【问题描述】:我正在努力为上述问题找到一个非常好的、全面的答案。
让我们采用以下数据框:
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
的基本命名法。
如果我想传入布尔条件,我可以执行 df[df.A > 0]
之类的操作来返回 df.A
大于 0 的行。我可以包含多个条件,例如 df[(df.A > 0) & (df.Category == 'Cat1')]
以包含多个条件。
但我没有看到的一件事是,我如何选择具有上面使用的两个布尔条件的数据框列的子集。
我尝试过的两种方法都没有成功:
df['B'].where(df.A > 0)
这会返回索引中的所有行,而我只想要那些为所述条件返回 True
的行。
我也尝试过使用query
,但没有成功,因为它不能用于系列。
所以df['A'].query(some condition)
返回一条错误消息。
理想情况下,我正在寻找的解决方案具有以下条件:
-
既可用于单列也可用于多列。也就是说,你可以同时选择
df['A']
和df['B']
。
可以根据需要使用多个布尔条件,而不仅仅是一个。
仅返回条件为 True
的行,而不是所有行。
理想情况下,语法上很简单,但如果不可能,那就这样吧。
谢谢。
【问题讨论】:
【参考方案1】:我想你在找.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
【讨论】:
你太快了!并祝贺你获得 100K!【参考方案2】:您正在正确处理您的df['B'].where(df.A > 0)
条件。但是,只需在其后附加几个函数即可仅实现 True
结果。
具有多个(也可以通过单个)条件的示例:
df[['B','C']].where((df.A > 1) & (df.D>0)).dropna().reset_index(drop=True)
【讨论】:
【参考方案3】:只是@W-B's answer 的变体,使用query
:
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
【讨论】:
@Datanovice:“只在索引上工作”是什么意思?我查看了问题中列出的四个要求,并认为query
解决了所有这些要求。它也是works fine on different index levels。
抱歉,我应该先查阅文档。我在想。 .filter函数。谢谢你教我一些新东西。
@Datanovice:不用担心 :)以上是关于如何使用多个布尔条件选择 Pandas DataFrame 中的特定列的主要内容,如果未能解决你的问题,请参考以下文章
如何根据计数器应用多个条件,并使用 pandas 和 python 在 excel 中为每个条件提供输出?