如何通过双列映射匹配两个Pandas DataFrame并避免重复?
多列匹配更新Pandas DataFrame解决单列映射重复行问题
问题场景
使用单列映射两个Pandas DataFrame时出现重复行,需要通过**c1与c2、d1与d2两列组合匹配**唯一行,将df2的e2值替换为df1中对应匹配行的e1值,无匹配的行保留原e2值。
原始数据
df1
idx a1 b1 c1 d1 e1 12 4 x10 2 2 5 13 5 x2 3 5 4 14 6 x4 6 9 6 15 7 x13 7 9 2
df2
idx a2 b2 c2 d2 e2 1 x2 x1 2 2 4 2 x8 x2 6 9 8 3 x6 x4 7 9 5 4 x4 x7 6 8 9
解决方案
通过merge基于多列键匹配,结合fillna完成值更新,步骤如下:
import pandas as pd # 构建示例数据 df1 = pd.DataFrame({ 'idx': [12,13,14,15], 'a1': [4,5,6,7], 'b1': ['x10','x2','x4','x13'], 'c1': [2,3,6,7], 'd1': [2,5,9,9], 'e1': [5,4,6,2] }) df2 = pd.DataFrame({ 'idx': [1,2,3,4], 'a2': ['x2','x8','x6','x4'], 'b2': ['x1','x2','x4','x7'], 'c2': [2,6,7,6], 'd2': [2,9,9,8], 'e2': [4,8,5,9] }) # 提取df1中用于匹配和替换的列,重命名对齐df2的列名 match_map = df1[['c1', 'd1', 'e1']].rename(columns={'c1':'c2', 'd1':'d2'}) # 左连接合并,保留df2所有行 merged_df = df2.merge(match_map, on=['c2', 'd2'], how='left') # 更新e2:有匹配值则用e1,无匹配则保留原e2 merged_df['e2'] = merged_df['e1'].fillna(merged_df['e2']) # 移除临时列,得到最终结果 final_df = merged_df.drop(columns=['e1']) print(final_df)
执行结果
idx a2 b2 c2 d2 e2 0 1 x2 x1 2 2 5 1 2 x8 x2 6 9 6 2 3 x6 x4 7 9 2 3 4 x4 x7 6 8 9
说明
- 采用多列组合作为匹配键,避免了单列映射可能出现的重复匹配问题,确保每行匹配唯一;
left join保证df2的所有行都被保留,不会因为无匹配而丢失数据;fillna确保无匹配的行保留原始e2值,符合需求。
内容的提问来源于stack exchange,提问作者sam_alloy
相关产品推荐
相关产品推荐

