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

pandas pivot_table多级列索引处理:如何移除date索引保留id列

这个问题已被多次提及,但过往给出的解决方案均无法生效。


初始数据结构

现有如下结构的DataFrame:

df = pd.DataFrame({
"date": ["20180920"] * 3 + ["20180921"] * 3,
"id": ["A12","A123","A1234","A12345","A123456","A0"],
"mean": [1,2,3,4,5,6],
"std" :[7,8,9,10,11,12],
"test": ["a", "b", "c", "d", "e", "f"],
"result": [70, 90, 110, "(-)", "(+)", 0.3],})

df

透视操作与现有结果

使用pivot_table进行透视:

df_sum_table = (pd.pivot_table(df,index=['id'], columns = ['date'], values = ['mean','std']))

运行后结果如下:
透视结果
查看列结构输出为:

df_sum_table.columns

MultiIndex([('mean', '20180920'),
        ('mean', '20180921'),
        ( 'std', '20180920'),
        ( 'std', '20180921')],
       names=[None, 'date'])

需求与遇到的问题

需求是将date层级的列下移一行,移除id所在的行但保留id列名。
参考现有解决方案后使用如下代码调整:

df_sum_table = (pd.pivot_table(df,index=['id'], columns = ['date'], values = ['mean','std'])).reset_index().rename_axis(None, axis=1)

运行后报错:

TypeError: Must pass list-like as names.

预期输出效果如下:
预期结果


解决方法

报错原因是当前为多级列索引,调用rename_axis时传入单个None和层级数量不匹配,需要给每一级列索引都传入对应名称参数,调整为如下代码即可实现需求:

# 生成透视表
df_sum_table = pd.pivot_table(df, index=['id'], columns=['date'], values=['mean','std'])
# 移除两级列索引的名称,再重置索引把id转为普通列保留
df_sum_table = df_sum_table.rename_axis([None, None], axis=1).reset_index()

如果后续需要把多级列压平为单层级,可以用如下代码拼接列名:

df_sum_table.columns = [f'{col[0]}_{col[1]}' if col[1] else col[0] for col in df_sum_table.columns]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:24:02