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

Pandas分组聚合计算占比时触发KeyError: 'sum'报错求解

Pandas 报 KeyError: 'sum' 问题排查

你怀疑的占比计算行本身写法没有语法问题,报错根源在前置的total_count生成逻辑,合并后的结果集里根本不存在sum列,取数时才会触发键错误。

具体错误逻辑

  • 第一部分分组统计用.size()实现,返回的是记录分组计数的单值Series,转成DataFrame后默认列名为0,因此重命名为count的操作可以正常生效。
  • 第二部分分组直接调用.sum()时,Pandas会默认对所有非分组键的数值列做聚合求和,返回结果中不存在列名为0的列,你写的.rename(columns={0: 'sum'})没有匹配到任何目标列,自然不会生成预期的sum列。后续左连接时,total_count仅携带category字段和原数据的其他数值列,没有你需要的分组总数字段,执行apply逻辑取x['sum']时就会触发KeyError。

修复后代码

def conversion(self, data):
    result = data.groupby(['category', 'pred']).size().rename('count').reset_index()
    # 修复:统计每个类别的总样本数,和第一处逻辑一致用size()计数,直接重命名列即可
    total_count = data.groupby(['category']).size().rename('sum').reset_index()
    result = pd.merge(result, total_count, how='left', on=['category'])
    # 优化:直接用向量运算替代apply+lambda,性能更高
    result['percentage'] = result['count'] / result['sum'] * 100
    result['CategoryID'] = result['category'].replace({'En': 1, 'Go': 2, 'So': 3})
    return result

写法优化说明

  • 分组聚合返回的Series可以直接通过.rename('目标列名')指定聚合结果的列名,不需要先转成DataFrame再重命名默认的0列,代码更简洁。
  • Pandas列级算术运算直接走原生向量计算,相比逐行执行的apply效率高1~2个数量级,数据量越大优势越明显。

内容的提问来源于stack exchange,提问作者user3027695

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:21:39