如何实现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
相关产品推荐
相关产品推荐

