如何逆透视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
相关产品推荐
相关产品推荐

