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

如何逆透视Pandas透视表?仅将日期列头转为行

如何将Pandas透视表中的Date表头转为行数据?

你当前的透视表带有多层列索引,Date(JAN2022、FEB2022)是外层列索引,内层为Income和Expenses指标,ID作为普通列。要将Date表头转为行数据,可通过以下步骤实现:

解决方案代码

import pandas as pd

# 你的示例数据框创建代码
data={'Date':['JAN2022','JAN2022','FEB2022','FEB2022'],'ID':['A','B','A','B'],'Income':[100,90,10,280],'Expenses':[-23,-20,-53,-70]}
df = pd.DataFrame(data)
df = pd.pivot_table(df, index='ID', values=['Income','Expenses'], columns='Date', aggfunc='sum').swaplevel(0, 1, 1).sort_index(1).reset_index()

# 核心转换代码
result = (df.set_index('ID')           # 将ID设为索引,避免被后续操作影响
           .stack(level=0)             # 将外层Date列索引转为行索引
           .reset_index()              # 把多层行索引转为普通列
           .rename(columns={'level_1': 'Date'})  # 重命名自动生成的列名
           .reindex(columns=['Date', 'ID', 'Income', 'Expenses']))  # 调整列顺序

print(result)

输出结果

Date ID  Income  Expenses
0  JAN2022  A     100       -23
1  JAN2022  B      90       -20
2  FEB2022  A      10       -53
3  FEB2022  B     280       -70

步骤解释

  • set_index('ID'):把ID列设为数据框索引,确保后续处理列索引时不会改动ID数据。
  • stack(level=0):将多层列索引的第0层(即Date对应的JAN2022、FEB2022)转换为行索引的一部分,此时行索引变为ID+Date的多层结构,列仅保留Income和Expenses。
  • reset_index():把多层行索引转换为普通列,此时Date对应的列名为自动生成的level_1。
  • rename(columns={'level_1': 'Date'}):将自动生成的列名改为Date,符合需求格式。
  • reindex(columns=['Date', 'ID', 'Income', 'Expenses']):调整列的显示顺序,和期望结果一致。

替代实现方式(使用melt)

如果偏好melt方法,也可以这样写:

result = df.melt(id_vars='ID', 
                 var_name=['Date', '_'], 
                 value_name='Value')
result = result.pivot_table(index=['ID', 'Date'], 
                            columns='_', 
                            values='Value').reset_index().reindex(columns=['Date', 'ID', 'Income', 'Expenses'])

不过stack的方式代码更简洁,处理多层列索引的效率也更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:06:32