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
相关产品推荐
相关产品推荐

