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

