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

如何基于A、B列匹配两个Pandas DataFrame并让df1优先?

Pandas DataFrame 按指定规则合并的实现方法

需求说明

当两个DataFrame的A、B列值完全匹配时,保留df1的C列值;未匹配的行(仅在其中一个DataFrame存在的行),保留各自的C列值,最终合并成目标结果。

解决方案

这里提供两种可行的实现方式:

方法一:外连接 + 列值优先级处理

先通过外连接保留所有行,再按规则合并C列:

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'A': [1,1,1,2,3],
    'B': ['a','b','c','d','k'],
    'C': ['X','Y','U','T','Z']
})

df2 = pd.DataFrame({
    'A': [1,1,2,7],
    'B': ['a','d','d','y'],
    'C': ['M1','K','Fr','Io']
})

# 外连接,保留所有A、B组合,给两个C列加后缀区分
merged = pd.merge(df1, df2, on=['A','B'], how='outer', suffixes=('_df1', '_df2'))

# 生成新C列:优先使用df1的C值,无值时用df2的C值
merged['C'] = merged['C_df1'].combine_first(merged['C_df2'])

# 整理成目标格式
outdf = merged[['A','B','C']].sort_values(by='A').reset_index(drop=True)
print(outdf)

方法二:合并后分组取优先级行

将两个DataFrame合并后,通过分组优先保留df1的行:

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'A': [1,1,1,2,3],
    'B': ['a','b','c','d','k'],
    'C': ['X','Y','U','T','Z']
})

df2 = pd.DataFrame({
    'A': [1,1,2,7],
    'B': ['a','d','d','y'],
    'C': ['M1','K','Fr','Io']
})

# 给两个DataFrame添加来源标记
df1['source'] = 'df1'
df2['source'] = 'df2'

# 合并两个DataFrame
combined = pd.concat([df1, df2])

# 按A、B分组,优先保留df1的行(排序后取第一个)
outdf = combined.sort_values('source').groupby(['A','B'], as_index=False).first().drop('source', axis=1)
print(outdf)

两种方法最终都会输出符合需求的Outdf:

A  B   C
0  1  a   X
1  1  b   Y
2  1  c   U
3  1  d   K
4  2  d   T
5  3  k   Z
6  7  y  Io

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:21:20