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

如何实现Pandas多级索引DataFrame的正确逆透视?

解决多级索引DataFrame的逆透视问题

你当前的代码在处理时,把Dates列和多级索引列混在一起操作,导致stack后日期值与销售数据行分离,出现大量NaN。要让日期值对应到每一行销售数据,需要先将Dates列单独提取,再结合多级列的透视逻辑调整结构,具体实现如下:

完整代码

import pandas as pd

# 原始数据构造
df = pd.DataFrame([[2016, 2016, 2015, 2015], 
                   ['Dollar Sales', 'Unit Sales', 'Dollar Sales', 'Unit Sales'], 
                   [1, 2, 3, 4], [5, 6, 7, 8]], columns=[*'ABCD'])
df['Dates'] = ['date','Dates','10/12','06/08']

# 1. 构造正确的多级列索引(仅针对ABCD列)
col_tuples = list(zip(df.iloc[0, :4], df.iloc[1, :4]))
# 将Dates列单独纳入多级列分组
df.columns = pd.MultiIndex.from_tuples(col_tuples + [('Dates', 'Dates')], names=['Year', 'Sales'])

# 2. 提取有效数据行(跳过前两行表头)
df_data = df.iloc[2:].reset_index()

# 3. 提取Dates列值作为普通列,删除原多级列中的Dates项
df_data['Dates'] = df_data[('Dates', 'Dates')]
df_data = df_data.drop(columns=[('Dates', 'Dates')])

# 4. 对多级列执行stack,将Year和Sales转为行维度
df_stacked = df_data.set_index(['index', 'Dates']).stack(level=['Year', 'Sales']).reset_index()

# 5. 用pivot将Year转回列维度,得到目标宽表格式
df_final = df_stacked.pivot(
    index=['index', 'Sales', 'Dates'], 
    columns='Year', 
    values=0
).reset_index()

# 6. 调整列名和顺序,匹配期望结果
df_final = df_final.rename(columns={'index': 'level_0'})
df_final = df_final[['level_0', 'Sales', 2015, 2016, 'Dates']]

print(df_final)

执行结果

level_0         Sales  2015  2016   Dates
0          2  Dollar Sales     3     1  10/12
1          2    Unit Sales     4     2  10/12
2          3  Dollar Sales     7     5  06/08
3          3    Unit Sales     8     6  06/08

关键逻辑说明

  • 先将Dates列单独纳入多级列,后续提取为普通列,避免stack操作时与销售数据拆分
  • 通过stack把多级列的Year和Sales转为行维度,再用pivot将Year转回列维度,实现日期与销售数据的一一对应
  • 最后调整列名和顺序,完全匹配你需要的输出格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:20:34