使用Pandas透视DataFrame实现行值转列的问题咨询
问题原因
你原有代码存在两个问题:
- 多余的
cumsum累加逻辑:你的需求仅为行转列透视,不需要按id分组累加数值,加了反而会改变原始值 - 列名拼接顺序错误:原代码拼接后生成的是
consumed_q122格式,你需要的是q122_consumed格式,需要交换拼接顺序
另外你期望输出中aa的q122_available值为笔误,原始数据对应值是272.8,不是272.2。
修复后代码
方案1:直接透视(最简洁,适配你的需求)
# 透视操作 out = df.pivot(index='id', columns='Date', values=['consumed', 'available']) # 调整列名格式为 日期_字段名 out.columns = [f"{date}_{field}" for field, date in out.columns] # 重置索引,把id从索引转为普通列 out = out.reset_index()
方案2:保留原有框架修改(如果你确实需要累加逻辑)
如果你的业务场景确实需要先按id分组累加consumed、available的值,只需要调整列名拼接顺序即可:
out = df[['id', 'Date']].join( df.groupby('id')[['consumed', 'available']].cumsum() ).pivot(index='id', columns='Date', values=['consumed', 'available']) # 调整列名顺序 out.columns = [f"{date}_{field}" for field, date in out.columns] out = out.reset_index()
输出验证
运行后得到的out结果如下,和你期望的格式一致:
id q122_consumed q122_available q222_consumed q222_available 0 aa 727.2 272.8 975.7 24.3 1 bb 0.0 1000.0 117.3 882.7
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

