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

