如何合并求和多个Multi Index DataFrame并满足通用无硬编码约束
解决方案
核心思路
利用Pandas原生的索引自动对齐特性,先拼接所有DataFrame,再按行索引分组求和,全程不需要硬编码任何索引/列名,支持任意数量的多级索引DataFrame合并。
代码实现
import pandas as pd def merge_sum_multi_df(*dfs): """ 合并任意多个结构存在差异的多级索引DataFrame,匹配单元格自动求和 参数: *dfs: 任意数量的待合并DataFrame 返回: 求和后的结果DataFrame """ # 沿行方向拼接所有DataFrame,自动对齐列(支持多级列索引) concatenated = pd.concat(dfs, axis=0) # 按所有层级的行索引分组求和,自动适配行索引的级数 sum_result = concatenated.groupby(level=list(range(concatenated.index.nlevels))).sum() return sum_result
示例测试
首先构造你给出的示例数据:
# 构造df1 df1_columns = pd.MultiIndex.from_tuples( [('A','AC'), ('B','AD'), ('C','AK')], names=['Category','Region'] ) df1 = pd.DataFrame( [[2,3,4], [1,2,5], [2,0,2]], index = ['0-5 years', '5-10 years', '10-12 years'], columns = df1_columns ) # 构造df2 df2_columns = pd.MultiIndex.from_tuples( [('A','AC'), ('B','AD'), ('D','AM')], names=['Category','Region'] ) df2 = pd.DataFrame( [[1,4,1], [2,5,1], [3,6,0]], index = ['0-5 years', '5-10 years', '10-12 years'], columns = df2_columns )
调用函数得到结果:
result = merge_sum_multi_df(df1, df2) print(result)
输出结果和你期望的完全一致:
Category A B C D Region AC AD AK AM 0-5 years 3 7 4 1 5-10 years 3 7 5 1 10-12 years 5 6 2 0
方案特性
- 支持任意数量的DataFrame合并,没有数量上限
- 自动适配任意层级的行索引与列索引,不需要提前知道索引名或层级数
- 无额外依赖,仅用Pandas原生方法实现,性能稳定
内容的提问来源于stack exchange,提问作者chrisC
相关产品推荐
相关产品推荐

