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

如何将Pandas透视表的多级索引列名合并为单一列名?

解决Pandas透视表多级列名合并问题

没问题,这个多级列名合并的需求很常见,我来给你几个简单高效的实现方法,完美匹配你想要的「27,0_V1」这类列名格式。

先回顾你的场景

你先创建了基础DataFrame:

import pandas as pd

dt = pd.DataFrame({'At': ['A','B','C'], 'R': ['27,0', '27,0', '27,0'], 'V1': [0,0,0], 'V2': [100,32,72], 'V3':[31,12,3]})

然后通过pivot_table生成了带多级列索引的透视表:

pivot_dt = dt.pivot_table(index='At', columns='R', values=['V1','V2','V3']).reset_index()

此时的列结构是多级索引,每个数值列的名称是(Vx, '27,0')的元组,现在需要把它们合并成27,0_Vx的形式。

方法1:列表推导式直接修改列名

这是最直观的方式,专门针对你的场景处理:

# 保留At列,其他列反转层级后用下划线拼接
pivot_dt.columns = ['At'] + [f"{r}_{col}" for col, r in pivot_dt.columns[1:]]

这里pivot_dt.columns[1:]获取到的是所有数值列的多级元组(比如('V1', '27,0')),我们把元组里的第二个元素(R的值)放在前面,第一个元素(原列名V1/V2/V3)放在后面,用下划线连接。

方法2:通用的map函数处理(支持多R值场景)

如果你的数据里有多个不同的R值,这个方法更通用,不需要单独处理At列:

# 对每个列名判断:如果是元组就反转后拼接,否则直接保留(比如At列)
pivot_dt.columns = pivot_dt.columns.map(lambda x: '_'.join(reversed(x)) if isinstance(x, tuple) else x)

reversed(x)会把('V1', '27,0')转换成('27,0', 'V1'),再用_连接就得到了目标格式。

最终效果

执行上述任意一种方法后,打印pivot_dt就能得到你想要的结构:

At 27,0_V1 27,0_V2 27,0_V3
0  A       0      100       31
1  B       0       32       12
2  C       0       72        3

内容的提问来源于stack exchange,提问作者Náthali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:48:33