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

如何通过双列映射匹配两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:07:45