如何基于多重索引与指定列合并Pandas DataFrame?
基于多重索引与共享列合并DataFrame的解决方案
核心思路
要实现同时匹配多重索引(Group、Material)和SR列的左连接,保留dfA所有行并将无匹配项填充为np.nan,关键是把多重索引的层级和共享列一起作为合并键。
实现方法
方法1:兼容所有pandas版本的通用写法
先将多重索引重置为普通列,完成合并后再恢复索引:
import pandas as pd import numpy as np # 重置索引为列 dfA_reset = dfA.reset_index() dfB_reset = dfB.reset_index() # 基于Group、Material、SR三个字段左连接 merged = pd.merge(dfA_reset, dfB_reset, on=['Group', 'Material', 'SR'], how='left') # 恢复原多重索引 result = merged.set_index(['Group', 'Material']) print(result)
输出结果:
SR ValA ValB Group Material G1 M1 3 1 2.0 M1 5 2 4.0 M1 10 1 NaN M2 3 4 5.0 G2 M3 5 5 6.0 M3 15 6 NaN
方法2:pandas 1.5+ 简化写法
如果你的pandas版本在1.5及以上,可以直接指定索引作为合并键,无需重置:
# 直接用索引+SR列做左连接 merged = pd.merge(dfA, dfB, left_index=True, right_index=True, on='SR', how='left') # 清理重复的SR列(合并后会生成SR_x和SR_y,保留原dfA的SR) result = merged.rename(columns={'SR_x': 'SR'}).drop(columns='SR_y')
关键说明
- 必须将Group、Material(多重索引层级)和SR列共同作为合并键,才能实现精准匹配。
- 左连接(
how='left')是保留dfA所有行的核心,无匹配项会自动填充np.nan。
内容的提问来源于stack exchange,提问作者R Walser
相关产品推荐
相关产品推荐

