Pandas多列分组聚合出现KeyError: 'num_ratings'的解决方法
解决BoardGameGeek数据分组聚合的KeyError问题
错误原因
你遇到的KeyError: 'num_ratings',本质是因为在聚合字典中给单列(比如name)指定自定义函数时,传入函数的是该列的Series对象,而非整个分组的DataFrame——此时函数内部只能访问当前列的数据,自然找不到num_ratings列。
三种可行解决方案
方案1:用apply处理整个分组(最灵活)
直接针对每个分组的完整DataFrame编写聚合逻辑,能自由访问所有列:
import pandas as pd def group_agg(group): return pd.Series({ 'game_count': len(group), 'avg_rating': group['avg_rating'].mean().round(2), 'avg_playtime': group['playtime_num'].mean().round(0), 'most_rated_game': group.loc[group['num_ratings'].idxmax(), 'name'] }) # 执行聚合 result = grouped.apply(group_agg)
方案2:在agg中通过索引关联原数据
利用num_ratings的最大值索引,直接从原DataFrame中匹配对应的游戏名:
result = grouped.agg( game_count=('name', 'count'), avg_rating=('avg_rating', 'mean'), avg_playtime=('playtime_num', 'mean'), # 通过num_ratings的最大索引,从原表取name most_rated_game=('num_ratings', lambda x: popular.loc[x.idxmax(), 'name']) )
方案3:先排序再取首行(最高效)
先按分组键+num_ratings降序排序,再分组取首行,同时聚合其他统计量:
# 按分组规则排序,每组内评分最多的游戏排第一 sorted_data = popular.sort_values( ['support_solo', 'category', 'num_ratings'], ascending=[True, True, False] ) # 分组聚合 result = sorted_data.groupby(['support_solo', 'category']).agg( game_count=('name', 'count'), avg_rating=('avg_rating', 'mean'), avg_playtime=('playtime_num', 'mean'), most_rated_game=('name', 'first') )
注意事项
- 若存在多个游戏
num_ratings相同的情况,方案3会取排序后的第一个,方案1和2会取索引最小的那个,可根据需求调整idxmax的逻辑(比如结合name排序)。 - 方案3的性能最优,适合大数据量场景;方案1适合需要复杂自定义聚合逻辑的场景。
内容的提问来源于stack exchange,提问作者itsanhtuanho
相关产品推荐
相关产品推荐

