如何在DataFrame中对比分组后两类推荐状态的计数并生成结果
问题
我有如下数据集:
| Review | recommendation | game_name |
|---|---|---|
| Review...good | Recommended | Game 1 |
| Review...bad | Not Recommended | Game 1 |
| worst game | Not Recommended | Game 1 |
| Review...Not Recommended | Not Recommended | Game 1 |
| Review...awesome | Recommended | Game 2 |
| Review...the game is okay | Not Recommended | Game 2 |
| Review...the game is not fun | Not Recommended | Game 2 |
| amazing | Recommended | Game 2 |
| Good game..it's recommended | Recommended | Game 3 |
| Review...good | Recommended | Game 3 |
| Review...good | Recommended | Game 3 |
需要按game_name分组,统计每个游戏的"Recommended"和"Not Recommended"出现次数,并根据以下规则生成汇总结果:
- 若
Recommended次数 ≥Not Recommended次数,输出Recommended - 若
Recommended次数 <Not Recommended次数,输出Not Recommended
预期输出:
| Is_Recommended | game_name |
|---|---|
| Not Recommended | Game 1 |
| Recommended | Game 2 |
| Recommended | Game 3 |
我尝试了这段代码,但不知道后续如何处理:
df['recommended'] = df.groupby(['game_name','recommendation'])['recommendation'].transform('count')
解决方案
方法1:交叉表统计+条件判断
先通过交叉表统计每个游戏的推荐/不推荐次数,再用np.where生成最终判断:
import pandas as pd import numpy as np # 统计每个游戏的推荐、不推荐次数 counts = pd.crosstab(df['game_name'], df['recommendation']) # 根据次数对比生成结果 counts['Is_Recommended'] = np.where( counts['Recommended'] >= counts['Not Recommended'], 'Recommended', 'Not Recommended' ) # 整理成预期格式 result = counts[['Is_Recommended']].reset_index()
方法2:分组自定义函数
直接在分组后用自定义函数计算并返回判断结果:
import pandas as pd def judge_recommendation(group): rec_num = (group['recommendation'] == 'Recommended').sum() not_rec_num = (group['recommendation'] == 'Not Recommended').sum() return 'Recommended' if rec_num >= not_rec_num else 'Not Recommended' # 分组应用函数并整理结果 result = df.groupby('game_name')\ .apply(judge_recommendation)\ .reset_index(name='Is_Recommended')
方法3:改进你原有的代码
你原有的代码用transform会把计数广播到每一行,后续可以通过去重和比较得到结果:
import pandas as pd import numpy as np # 保留你的初始代码 df['count'] = df.groupby(['game_name','recommendation'])['recommendation'].transform('count') # 去重得到每个游戏的推荐/不推荐次数 counts_df = df[['game_name', 'recommendation', 'count']].drop_duplicates() # 转换为宽表方便比较 counts_wide = counts_df.pivot(index='game_name', columns='recommendation', values='count').fillna(0) # 生成判断结果 counts_wide['Is_Recommended'] = np.where( counts_wide['Recommended'] >= counts_wide['Not Recommended'], 'Recommended', 'Not Recommended' ) result = counts_wide[['Is_Recommended']].reset_index()
运行以上任意一种方法,都能得到你预期的结果DataFrame。
内容的提问来源于stack exchange,提问作者Pooja Soneja
相关产品推荐
相关产品推荐

