基于共同key合并两个DataFrame并更新填充值的实现方法
pandas 基于key合并并冲突替换的实现方法
要实现基于"key"列合并两个DataFrame,冲突列用右侧值替换左侧,同时填充右侧新列的需求,可以按以下步骤操作:
示例数据
首先定义你的两个DataFrame:
import pandas as pd import numpy as np left = pd.DataFrame( { "key": ["K0", "K1", "K2", "K3"], "A": ["A0", "A1", "A2", "A3"], "C": ["B0", "B1", np.nan, np.nan]}) right = pd.DataFrame( { "key": ["K2"], "A": ["A8"], "D": ["D3"]})
解决方案
这里提供两种简洁的实现方式:
方法一:利用merge+combine_first
先通过外连接合并两个DataFrame,再对冲突列进行值替换:
# 外连接合并,给右侧重复列加后缀 merged = pd.merge(left, right, on='key', how='outer', suffixes=('', '_right')) # 对冲突列A,优先使用右侧的值,没有则保留左侧原有值 merged['A'] = merged['A_right'].combine_first(merged['A']) # 删除多余的后缀列,整理列顺序 result = merged.drop(columns=['A_right'])[['key', 'A', 'C', 'D']]
方法二:利用索引匹配+update
将两个DataFrame以key为索引,通过update直接替换冲突值,再合并新列:
# 将DataFrame设置为key索引 left_idx = left.set_index('key') right_idx = right.set_index('key') # 复制左侧DataFrame,用右侧值更新冲突列(仅替换右侧有值的部分) result = left_idx.copy() result.update(right_idx) # 合并右侧的新列D,保留所有行 result = result.join(right_idx[['D']], how='left') # 重置索引恢复key列为普通列 result = result.reset_index()[['key', 'A', 'C', 'D']]
最终结果
两种方法都能得到你期望的输出:
key A C D 0 K0 A0 B0 NaN 1 K1 A1 B1 NaN 2 K2 A8 NaN D3 3 K3 A3 NaN NaN
内容的提问来源于stack exchange,提问作者user18083922
相关产品推荐
相关产品推荐

