Pandas处理含13月全年累计数据新增FY列groupby报错如何解决
问题原因
- 分组语法错误:
pandas的groupby方法传入多个分组列时,必须将列名包裹在列表中作为第一个参数,你写的groupby('OpNum','Year')会将第二个参数'Year'识别为axis(轴)参数,而axis仅支持0/1/index/columns类型的取值,因此抛出ValueError。 - 业务逻辑偏差:你的需求是直接提取已经存在的
month=13行的全年合计值,不需要对所有行的MTD求和,否则会把13月的合计值也加入计算,得到错误的翻倍结果。 - 语法小错误:新列名
FY是字符串类型,需要用引号包裹,写成df['FY'],否则会被识别为未定义的变量,触发NameError。
正确实现代码
方案1:复用现有13月合计值(推荐,避免重复计算误差)
# 生成OpNum+Year对应全年合计的映射 fy_mapping = df[df['month'] == 13].set_index(['OpNum', 'Year'])['MTD'].to_dict() # 映射生成FY列 df['FY'] = df.apply(lambda x: fy_mapping[(x['OpNum'], x['Year'])], axis=1) # 筛选保留1-12月数据,得到最终结果 result_df = df[df['month'] <= 12].reset_index(drop=True)
方案2:自行计算1-12月MTD总和作为FY值
# 先筛选1-12月数据,多列分组后用transform将汇总值广播到每一行 df['FY'] = df[df['month'] <= 12].groupby(['OpNum', 'Year'])['MTD'].transform('sum') # 剔除空值的13月行 result_df = df.dropna(subset=['FY']).reset_index(drop=True)
结果验证
两种方案输出的result_df和你给出的预期输出完全一致,每个OpNum对应年份的12个月行都会带上对应全年合计值。
内容的提问来源于stack exchange,提问作者user1855463
相关产品推荐
相关产品推荐

