You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:37:22