使用 OR 语句过滤 Pandas 数据框

Posted

技术标签:

【中文标题】使用 OR 语句过滤 Pandas 数据框【英文标题】:Filtering Pandas Dataframe using OR statement 【发布时间】:2015-06-10 06:07:31 【问题描述】:

我有一个 pandas 数据框,我想根据数据框中两列的值过滤整个 df。我想取回 IBRD 或 IMF != 0 的所有行和列。

alldata_balance = alldata[(alldata[IBRD] !=0) or (alldata[IMF] !=0)]

但这给了我一个ValueError

ValueError:Series 的真值不明确。使用a.empty, a.bool()、a.item()、a.any() 或 a.all()。

所以我知道我没有正确使用 or 语句,有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

来自文档:

另一个常见的操作是使用布尔向量来过滤 数据。运算符是: |为或,& 为和,~ 为非。这些 必须使用括号进行分组。

http://pandas.pydata.org/pandas-docs/version/0.15.2/indexing.html#boolean-indexing

试试:

alldata_balance = alldata[(alldata[IBRD] !=0) | (alldata[IMF] !=0)]

【讨论】:

谢谢,效果很好。我应该读过文档的那部分。 6 年后,我发现自己经常在这里......我有点难过,“自然 Python 语法”在这种情况下不起作用,因为我敢打赌这会让人们大吃一惊。【参考方案2】:

您可以执行以下操作来实现您的结果:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
....
....
#use filter with plot
#or
fg=sns.factorplot('Retailer country', data=df1[(df1['Retailer country']=='United States') | (df1['Retailer country']=='France')], kind='count')

fg.set_xlabels('Retailer country')
plt.show()


#also
#and
fg=sns.factorplot('Retailer country', data=df1[(df1['Retailer country']=='United States') & (df1['Year']=='2013')], kind='count')

fg.set_xlabels('Retailer country')
plt.show()

【讨论】:

这是对所发布问题的回答吗?如果是这样,你为什么还要解释seaborn?另外,请看看如何format your answers

以上是关于使用 OR 语句过滤 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用 groupby 的结果过滤 pandas 数据框

过滤数据框的 Pandas 直方图

Pandas:按类别过滤数据框

在 pyspark 中使用 pandas_udf 过滤数据框

在 Pandas 数据框中过滤多个列以获取相同的字符串

使用 Pandas 在 Python 中过滤嵌套的 JSON 数据