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

按公司分组生成total_amount列时,df.cumsum()报ValueError与KeyError

解决分组累计求和时的KeyError和ValueError问题

看起来你遇到的问题其实挺常见的,咱们一步步拆解原因和解决办法:

问题根源分析

你最初的代码df['total_amount'] = df.groupby('company').cumsum()暂时有效,大概率是因为当时你的数据框只有amount这一个数值型列——此时groupby('company').cumsum()会返回一个仅包含amount累计值的Series,刚好可以直接赋值给新列total_amount。

但调整代码位置后出现两个错误:

  1. KeyError: "total_amount":说明你在创建total_amount列之前,就有代码尝试去读取这个还不存在的列了,代码执行顺序搞反了。
  2. ValueError: Wrong number of items passed, placement implies 1:这是因为调整代码后,你的数据框可能新增了其他数值型列(或者你之前没注意到已有其他数值列),此时groupby('company').cumsum()会对所有数值列计算累计和,返回的是一个多列的DataFrame,而你试图把整个DataFrame赋值给一个单列,自然就会报错。

正确的解决方案

1. 修正代码执行顺序

先执行创建total_amount的代码,再执行任何需要用到这个列的后续逻辑,彻底避免KeyError。

2. 精准指定累计求和的列

不要直接对整个分组后的DataFrame做cumsum(),而是明确指定只对amount列计算分组累计和:

df['total_amount'] = df.groupby('company')['amount'].cumsum()

这样不管你的数据框里有多少其他数值列,都会只针对amount列计算分组内的累计和,返回的是一个单列Series,刚好可以赋值给新列total_amount。

验证效果

用你给出的示例数据测试,执行上述代码后,就能得到你期望的结果:

companyamounttotal_amount
company 11000010000
company 12000030000
company 13000060000
company 21000010000
company 22000030000
company 31000010000
company 41000010000
company 42000030000
company 51000010000
company 52000030000
company 53000060000
company 540000100000

额外提示

如果后续还要对total_amount列做操作,记得确认它的数值类型是否正确(比如是否为int/float),避免出现意外的类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:20:08