如何基于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
相关产品推荐
相关产品推荐

