如何同时取消堆叠两列生成合并列名?分组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大概是这样的结构(以你提供的样例数据为例):
| ID | Name | Category | INT_2018-02-28 | INT_2018-03-31 | FEE_2018-02-28 | FEE_2018-03-31 |
|---|---|---|---|---|---|---|
| 123 | ABC | Fruits | 22345 | 790 | NaN | NaN |
| 456 | JFGT | Veg | NaN | NaN | 56879 | 35637 |
| 5687 | AST | Seeds | 236 | 236 | 4567 | 4567 |
补充:如果已经做过分组聚合
如果你之前已经通过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
相关产品推荐
相关产品推荐

