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

合并两个Pandas DataFrame遇格式问题求助(双行索引、同列名)

解决Pandas双索引DataFrame合并问题的思路

嘿,我来帮你捋清楚这个合并问题!既然两个DataFrame的列名完全一致,还都用了双行索引,那核心肯定是基于索引来对齐操作——这大概率是你之前用merge/concat没拿到预期结果的原因,毕竟默认参数不一定适配双索引的场景。

下面根据不同的需求场景,给你对应的解决方法:

场景1:想把两个DataFrame的行全部堆叠,保留所有索引

如果你的目标是把两个表的行都整合到一起,不管索引是否重复,直接用concat并指定按行堆叠:

import pandas as pd
# 假设df1和df2是你的两个双索引DataFrame
combined = pd.concat([df1, df2], axis=0, keys=['df1', 'df2'], join='outer')
  • axis=0:按行方向堆叠
  • keys:给每个原DataFrame加一个外层索引,方便区分数据来源
  • join='outer':保留两个表的所有索引(如果用join='inner'则只保留共同索引)

如果索引有重复,想把相同索引的行合并(比如求和、取均值),可以在concat后加分组聚合:

combined_agg = pd.concat([df1, df2], axis=0).groupby(level=[0, 1]).sum()
# level=[0,1]对应双索引的两级,sum可以换成mean、first等聚合方法

场景2:想按索引对齐合并列,保留共同索引

如果你的目标是把两个表中索引完全匹配的行合并成一行(因为列名相同,会自动给列加后缀区分),用merge并指定基于索引合并:

merged = pd.merge(df1, df2, left_index=True, right_index=True, how='inner', suffixes=('_from_df1', '_from_df2'))
  • left_index=True/right_index=True:用两个表的行索引作为匹配键
  • how='inner':只保留两个表都有的索引(换成outer则保留所有索引,缺失值用NaN填充)
  • suffixes:自定义列名后缀,避免列名重复冲突

场景3:想用一个表填充另一个表的缺失索引行

如果你的目标是用df2的内容补充df1中不存在的索引行,同时保留df1已有索引的原值,用combine_first:

filled_df = df1.combine_first(df2)

这个方法会自动按双索引对齐,df1里有的索引行保持不变,df1没有的索引行用df2的内容填充。

举个直观的例子

先创建两个带双索引的测试DataFrame:

# 创建df1
idx1 = pd.MultiIndex.from_tuples([('A', 'x'), ('B', 'y'), ('C', 'z')], names=['level1', 'level2'])
df1 = pd.DataFrame({'col1': [1,2,3], 'col2': [4,5,6]}, index=idx1)

# 创建df2
idx2 = pd.MultiIndex.from_tuples([('B', 'y'), ('C', 'z'), ('D', 'w')], names=['level1', 'level2'])
df2 = pd.DataFrame({'col1': [7,8,9], 'col2': [10,11,12]}, index=idx2)

用上面的方法测试,就能看到不同的合并效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:34:03