如何合并两个DataFrame且不覆盖目标DataFrame中已存在的原有数据
Pandas合并DataFrame仅填充空缺值的实现方法
核心需求是合并时仅用第二个DataFrame的对应数据填充目标DataFrame的空值,完全保留目标DataFrame已有的有效数据,实现逻辑如下:
前置准备:构造测试数据
import pandas as pd import numpy as np # 构造目标DataFrame df1 df1 = pd.DataFrame({ 'Name': ['a', 'b', 'c', 'd'], 'Subject': ['Ta', 'En', 'Ma', 'Ss'], 'mark': [52, np.nan, np.nan, 60] }) # 构造用于填充的DataFrame df2 df2 = pd.DataFrame({ 'Name': ['b', 'c'], 'mark': [57, 58] })
方法1:combine_first 最简实现(推荐)
该方法会优先保留调用对象(df1)的所有非空值,仅用传入对象(df2)的对应值填充空值,适配多字段同时填充的场景:
# 以公共主键Name设置索引,对齐两条数据 df1_idx = df1.set_index('Name') df2_idx = df2.set_index('Name') # 执行合并填充 result = df1_idx.combine_first(df2_idx).reset_index() # 调整列顺序与原df1一致 result = result[['Name', 'Subject', 'mark']]
方法2:左连接+针对性填充(可控性更高)
如果只需要填充指定字段,不想影响其他字段,可使用左连接后单独处理空值的方式:
# 左连接两个表,用后缀区分不同来源的mark字段 merged_df = df1.merge(df2, on='Name', how='left', suffixes=('', '_fill')) # 仅当原mark列为空时,用填充表的mark值补全 merged_df['mark'] = merged_df['mark'].fillna(merged_df['mark_fill']) # 删除辅助列得到最终结果 result = merged_df.drop('mark_fill', axis=1)
注意事项
如果df1中的空缺值为空白字符串而非NaN类型,需要先将空缺值转换为NaN再执行上述操作,否则填充逻辑不会生效,转换代码如下:
df1['mark'] = df1['mark'].replace('', np.nan)
两种方法最终输出的结果均符合需求:
| Name | Subject | mark |
|---|---|---|
| a | Ta | 52 |
| b | En | 57 |
| c | Ma | 58 |
| d | Ss | 60 |
内容的提问来源于stack exchange,提问作者Jagadeeshkumar Viswanathan
相关产品推荐
相关产品推荐

