Python中如何合并pandas pivot_table生成的多级表头两列?
解决方案
完全可以仅通过pandas实现该需求,无需依赖额外第三方库,以下是可直接运行的示例代码:
步骤1:构造模拟数据(匹配你给出的原始DataFrame结构)
import pandas as pd # 构造多级列索引:第一层为foo/bar,第二层为Cond1对应的60/65 cols = pd.MultiIndex.from_product( [["foo", "bar"], [60, 65]], names=[None, "Cond1"] ) # 构造原始DataFrame df = pd.DataFrame( [[200, 210, 16.7, 15.2], [200, 210, 14.9, 13.5]], index=pd.Index([50, 100], name="Cond2"), columns=cols )
步骤2:合并foo与bar对应数值
核心逻辑是按第二层列索引(即Cond1的60/65)分组,将同组内foo和bar的数值格式化为a(b)的字符串格式,再调整列索引即可:
# 按二级列索引分组,拼接foo和bar的数值 result = df.groupby(level=1, axis=1).apply( lambda group: group.xs("foo", level=0, axis=1).astype(str) + "(" + group.xs("bar", level=0, axis=1).astype(str) + ")" ) # 调整列索引,匹配你需要的顶层名称 result.columns = pd.MultiIndex.from_product( [["foo(bar)"], result.columns], names=[None, "Cond1"] )
格式优化说明
如果你需要控制数值的显示精度(比如foo值取整、bar值保留1位小数),可以将astype(str)替换为格式化方法,避免浮点数出现多余小数位:
# 替换拼接逻辑为带精度格式化的版本 result = df.groupby(level=1, axis=1).apply( lambda group: group.xs("foo", level=0, axis=1).applymap(lambda x: f"{x:.0f}") + "(" + group.xs("bar", level=0, axis=1).applymap(lambda x: f"{x:.1f}") + ")" )
运行上述代码后输出的result就和你要求的目标结构完全一致。
内容的提问来源于stack exchange,提问作者OzTheWeird
相关产品推荐
相关产品推荐

