熊猫:考虑多种条件正确过滤数据框列

Posted

技术标签:

【中文标题】熊猫:考虑多种条件正确过滤数据框列【英文标题】:Pandas: Filter correctly Dataframe columns considering multiple conditions 【发布时间】:2021-01-12 20:24:47 【问题描述】:

我有一个代表餐馆顾客评分的数据框。 star_rating 是此数据框中客户的评分。

我想要做的是在同一数据框中添加一列nb_favorables_mention,表示收到至少一个“有用”或“有趣”或“酷”评级的评论总数以及评论的评分是> = 3。
data = 'rating_id': ['1', '2','3','4','5','6','7','8','9'],
        'user_id': ['56', '13','56','99','99','13','12','88','45'],
        'restaurant_id':  ['xxx', 'xxx','yyy','yyy','xxx','zzz','zzz','eee','eee'],
        'star_rating': ['2.3', '3.7','1.2','5.0','1.0','3.2','1.0','2.2','0.2'],
        'rating_year': ['2012','2012','2020','2001','2020','2015','2000','2003','2004'],
        'first_year': ['2012', '2012','2001','2001','2012','2000','2000','2001','2001'],
        'last_year': ['2020', '2020','2020','2020','2020','2015','2015','2020','2020'],
        'funny': ['1', '0','0','1','1','1','0','0','0'],
        'useful': ['1', '0','0','0','1','0','0','0','1'],
        'cool': ['1', '0','0','0','1','1','1','1','1'],

        


df = pd.DataFrame (data, columns = ['rating_id','user_id','restaurant_id','star_rating','rating_year','first_year','last_year','funny','useful','cool'])
df['star_rating'] = df['star_rating'].astype(float)



filtered_data = df[(df['star_rating'] >= 3) & (df['funny']==1 | df['useful']==1 | df['cool']==1)]
d = filtered_data.groupby('restaurant_id')['star_rating'].count().to_dict()

df['nb_favorables_mention'] = df['restaurant_id'].map(d)
df.head(20)

我不确定我的语法有什么问题,但根据我的尝试,我不断收到这些错误消息

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

TypeError:无法使用 dtyped [object] 数组和 [bool] 类型的标量执行 'ror_'

考虑到我想要实现的目标,正确的语法是什么?

【问题讨论】:

【参考方案1】:

您有运算符优先级问题;在 python 中,| 运算符的优先级高于 ==,将比较表达式括在括号中应该可以解决您的问题,同样因为 funnyusefulcool 列是 str 类型,请使用字符串 '1' 而不是号码1

filtered_data = df[(df['star_rating'] >= 3) & ((df['funny']=='1') | (df['useful']=='1') | (df['cool']=='1'))]

Check result here

除了使用|之外,您还可以一次比较多个列,然后使用any检查条件:

filtered_data = df[(df['star_rating'] >= 3) & df[['funny', 'useful', 'cool']].eq('1').any(axis=1)]

【讨论】:

感谢您的回答我认为它适用于我更大的数据集,但我有一个奇怪的警告说FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison return op(a, b).你知道这是什么意思吗? 它是来自上面的代码 sn-p 还是你代码的其他部分? 在我的数据框上执行 .head() 时高于输出。从您指出的第一个操作开始。 你可能想检查这个问题:***.com/questions/40659212/… 我知道,在我较大的数据框中,funny 等中的值不是字符而是整数

以上是关于熊猫:考虑多种条件正确过滤数据框列的主要内容,如果未能解决你的问题,请参考以下文章

比较熊猫数据框列中的值时出现类型错误

将一个数据框列值传递给另一个数据框过滤条件表达式 + Spark 1.5

Pandas 通过子字符串匹配过滤数据框列

多条件过滤器 python pandas

熊猫:按多个条件过滤组?

如何根据条件过滤后的熊猫数据框来导出列