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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:15:05