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

如何合并两个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)

两种方法最终输出的结果均符合需求:

NameSubjectmark
aTa52
bEn57
cMa58
dSs60

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:39:03