如何将Pandas MultiIndex列名拼接为指定格式?
Pandas MultiIndex列名拼接方案
问题场景
现有Pandas DataFrame的列是MultiIndex结构:
df_incumbent_Q.columns
输出结构:
MultiIndex([('Cust Linehaul', '2022Q2'), ('Cust Linehaul', '2022Q3'), ('Cust Linehaul', '2022Q4'), ( 'Load Number', '2022Q2'), ( 'Load Number', '2022Q3'), ( 'Load Number', '2022Q4')], names=[None, 'Quarter'])
需要将列名拼接为以下格式:
['Cust Linehaul_2022Q2', 'Cust Linehaul_2022Q3', 'Cust Linehaul_2022Q4', 'Load Number_2022Q2', 'Load Number_2022Q3', 'Load Number_2022Q4']
错误尝试回顾
直接将MultiIndex元组转字符串后拼接,会出现Period格式冗余:
df_incumbent_Q.columns =[''.join(str(c)) for c in df_incumbent_Q.columns]
输出错误结果:
Index(['('Cust Linehaul', Period('2022Q2', 'Q-DEC'))', '('Cust Linehaul', Period('2022Q3', 'Q-DEC'))', '('Cust Linehaul', Period('2022Q4', 'Q-DEC'))', '('Load Number', Period('2022Q2', 'Q-DEC'))', '('Load Number', Period('2022Q3', 'Q-DEC'))', '('Load Number', Period('2022Q4', 'Q-DEC'))'], dtype='object')
后续用简单replace无法彻底清理冗余内容。
解决方案
方法一:直接遍历元组拼接(优先推荐)
无需将元组转成完整字符串再处理,直接提取元组内的元素,用下划线连接:
df_incumbent_Q.columns = ['_'.join(map(str, col)) for col in df_incumbent_Q.columns]
原理:每个col是MultiIndex中的元组,map(str, col)会把元组内的每个元素(包括Period类型的季度值)转成对应字符串,再通过_拼接,直接得到目标格式。
也可以用f-string简化写法:
df_incumbent_Q.columns = [f"{col[0]}_{col[1]}" for col in df_incumbent_Q.columns]
f-string会自动将Period对象转换为对应的季度字符串(如Period('2022Q2', 'Q-DEC')转成'2022Q2')。
方法二:正则替换修复错误列名
如果已经生成了带冗余内容的列名,用正则表达式批量清理:
df_incumbent_Q.columns = df_incumbent_Q.columns.str.replace(r"\(|\)|Period|'Q-DEC'", "", regex=True).str.replace(", ", "_")
步骤说明:
- 先移除括号、
Period关键字、'Q-DEC'这些冗余内容 - 再将元组内的逗号空格替换为下划线,得到目标列名格式
内容的提问来源于stack exchange,提问作者Rajib Lochan Sarkar
相关产品推荐
相关产品推荐

