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

如何合并Pandas DataFrame且不覆盖列数据

解决Pandas多DataFrame合并时的列覆盖问题

你的问题出在两次合并的列名都是Source,直接依次merge会导致列冲突——要么生成重复列(比如Source_x、Source_y),要么覆盖原有值,再加上用fillna(0)把缺失值改成0,自然得不到想要的结果。下面是具体的解决步骤:

步骤1:先合并DF2到主DataFrame

先基于VID把DF2的Source合并进来,这时候只有V-2的Source会是缺失值:

import pandas as pd

# 创建示例DataFrame
Main_DF = pd.DataFrame({
    'VID': ['V-1', 'V-2', 'V-4', 'V-8'],
    'RID': ['R-as5', 'R-b8i', 'R-96s', 'R-2bv'],
    'Host': ['OS-1', 'OS-2', 'OS-4', 'OS-a'],
    'Ref': ['Blah', 'Blah', 'Blah', 'Blah']
})

DF2 = pd.DataFrame({
    'VID': ['V-1', 'V-4', 'V-8'],
    'Source': ['E', 'G', 'T']
})

DF3 = pd.DataFrame({
    'RID': ['R-b8i'],
    'Source': ['H']
})

# 第一步合并DF2
Main_DF = Main_DF.merge(DF2, on='VID', how='left')

步骤2:合并DF3并填充缺失值

合并DF3时指定后缀避免列名冲突,然后用DF3的Source值填充主DF中Source的缺失值:

# 合并DF3,指定后缀区分重复列名
Main_DF = Main_DF.merge(DF3, on='RID', how='left', suffixes=('', '_from_RID'))
# 填充缺失的Source值
Main_DF['Source'] = Main_DF['Source'].fillna(Main_DF['Source_from_RID'])
# 删除临时生成的列
Main_DF = Main_DF.drop('Source_from_RID', axis=1)

最终结果

运行后你会得到期望的DataFrame:

VID    RID  Host   Ref Source
0  V-1  R-as5  OS-1  Blah      E
1  V-2  R-b8i  OS-2  Blah      H
2  V-4  R-96s  OS-4  Blah      G
3  V-8  R-2bv  OS-a  Blah      T

另一种更简洁的写法

可以用combine_first一步完成填充,不过需要先把DF3的索引改成RID,再映射到主DF:

Main_DF = Main_DF.merge(DF2, on='VID', how='left')
# 把DF3的Source映射到主DF的RID列,填充缺失值
Main_DF['Source'] = Main_DF['Source'].combine_first(Main_DF['RID'].map(DF3.set_index('RID')['Source']))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:13:30