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

如何合并从WHO API获取的带列层级索引的已透视Pandas DataFrame

嘿,针对你这个带列层级索引的Pandas DataFrame合并需求,我给你梳理几种常见场景的解决方案,都是实际工作里常用的套路:

1. 列层级结构完全一致,合并行数据

如果你的两个DataFrame(假设叫df1和df2)列的多层级索引完全匹配,只是行数据有重叠或互补,直接用pd.concat按行合并就好:

import pandas as pd

# 按行合并,保留原有的行索引(比如国家+年份组合)
merged_df = pd.concat([df1, df2], axis=0, ignore_index=False)

# 如果存在重复的行(比如同一个国家同一年的数据在两个DF里都有),可以去重
merged_df = merged_df.drop_duplicates()

2. 列层级部分重叠,横向合并列数据

如果是要把两个DF的列横向拼接,分两种子情况处理:

子情况A:自动对齐列层级

如果两个DF的列层级有部分重叠(比如顶层都是疾病类型,底层是年份),直接用pd.concat按列合并,Pandas会自动对齐相同层级的列:

# 横向合并列,保留所有列层级
merged_df = pd.concat([df1, df2], axis=1)

举个例子:如果df1的列是[('麻疹死亡数', '2020'), ('麻疹死亡数', '2021')],df2的列是[('麻疹死亡数', '2022'), ('肺炎死亡数', '2020')],合并后会自动把麻疹死亡数下的年份归到同一组,肺炎死亡数作为新的顶层列。

子情况B:基于指定列(而非索引)合并

如果你的行不是用索引对齐,而是有共同的标识列(比如'COUNTRY'和'YEAR'),可以先把列层级扁平化,再用merge:

# 第一步:把多层级列名转成普通字符串(用下划线连接层级)
df1.columns = df1.columns.map('_'.join)
df2.columns = df2.columns.map('_'.join)

# 第二步:基于共同列合并(how='outer'保留所有行,也可以用'inner'只保留交集)
merged_df = pd.merge(df1, df2, on=['COUNTRY', 'YEAR'], how='outer')

# 可选:合并后恢复多层级列索引
merged_df.columns = pd.MultiIndex.from_tuples([col.split('_') for col in merged_df.columns])

3. 列层级完全不同,先统一结构再合并

如果两个DF的列层级完全不匹配,你可以先手动调整其中一个的列层级,和另一个对齐后再合并:

# 比如把df2的列层级重命名成和df1一致的结构
df2.columns = pd.MultiIndex.from_tuples(
    [('麻疹死亡数', year) for (_, year) in df2.columns]
)

# 再按列合并
merged_df = pd.concat([df1, df2], axis=1)

小提醒

合并前一定要检查:用来对齐的行索引(或合并列)的数据类型是否一致!比如YEAR列是整数还是字符串,COUNTRY是全称还是代码,类型不匹配会导致合并后丢失数据或者出现空值。

内容的提问来源于stack exchange,提问作者kiltannen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:45:06