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

