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

如何同时取消堆叠两列生成合并列名?分组DataFrame按Group与Date展开Amount

解决同时取消堆叠两列生成合并列名的问题

嘿,这事儿不难,用Pandas的unstack()方法就能搞定,关键是先把要转成列的两个字段(Group和Date)设置成多重索引的层级,然后一次性unstack它们就行。我给你一步步拆解:

步骤1:准备数据与设置多重索引

假设你的DataFrame变量名叫df,首先我们需要把要保留为行维度的字段(比如ID、Name、Category)设为索引的第一层,然后把要转成列的Group和Date设为索引的后续层级:

# 设置多重索引
df_indexed = df.set_index(['ID', 'Name', 'Category', 'Group', 'Date'])

步骤2:取消堆叠两个列维度

接下来针对Amount字段,直接unstackGroup和Date这两个层级,这样就会把它们转成列的维度:

# 同时unstack Group和Date两个层级
df_unstacked = df_indexed['Amount'].unstack(['Group', 'Date'])

这时候你得到的是多级列名的DataFrame,列的第一层是Group的取值(比如INT、FEE),第二层是Date的取值(比如2018-02-28、2018-03-31)。

步骤3:(可选)合并多级列名为单个列名

如果觉得多级列名不方便,你可以把它们合并成单个字符串列名,比如用下划线连接:

# 合并多级列名,格式为「Group_Date」
df_unstacked.columns = ['_'.join(col) for col in df_unstacked.columns]

步骤4:(可选)重置索引为普通列

最后如果想把原来的行索引(ID、Name、Category)转回普通列,用reset_index()就行:

df_final = df_unstacked.reset_index()

示例输出效果

处理后的DataFrame大概是这样的结构(以你提供的样例数据为例):

IDNameCategoryINT_2018-02-28INT_2018-03-31FEE_2018-02-28FEE_2018-03-31
123ABCFruits22345790NaNNaN
456JFGTVegNaNNaN5687935637
5687ASTSeeds23623645674567

补充:如果已经做过分组聚合

如果你之前已经通过groupby做了聚合(比如按ID、Name、Category、Group、Date求和Amount),那直接对聚合后的Series执行unstack(['Group', 'Date'])就可以,不用再设置索引了:

# 假设已经聚合得到grouped_series
grouped_series = df.groupby(['ID', 'Name', 'Category', 'Group', 'Date'])['Amount'].sum()
df_unstacked = grouped_series.unstack(['Group', 'Date'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:17:18