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

pandas合并DataFrame时如何忽略NaN值保留双方非空数据

问题原因

pd.merge是基于列值做关联合并的方法,不是按索引+列位置对齐做填充,你之前的写法没有指定关联键,会默认按所有同名列做关联,且右连接会优先保留右表的所有值,自然会出现左表有效值被覆盖的问题,不适合你当前的场景。

实现方法

pandas原生提供了专门针对对齐填充场景的方法,不需要自己写循环判断空值,最直接的方案是使用combine_first:

import pandas as pd
import numpy as np

# 构造示例df_a、df_b
df_a = pd.DataFrame({
    'A': [1.0, np.nan, np.nan],
    'B': [np.nan, 1.0, np.nan],
    'C': [np.nan, np.nan, 1.0]
})
df_b = pd.DataFrame({
    'A': [np.nan, np.nan, 2.0],
    'B': [np.nan, 2.0, np.nan],
    'C': [2.0, np.nan, np.nan]
})

# 合并逻辑:df_a的非空值优先保留,空值位置用df_b对应位置的非空值填充
df_c = df_a.combine_first(df_b)

执行后输出的df_c完全匹配预期结果:

A    B    C
0  1.0  NaN  2.0
1  NaN  2.0  NaN
2  2.0  NaN  1.0

方法说明

  • combine_first会自动按索引、列名对齐两个DataFrame,不会出现同名列重名、笛卡尔积的问题,完全适配你两个表结构完全一致、对应位置取非空值的需求。
  • 如果需要自定义合并规则(比如两个位置都有值时取较大值、做计算),可以使用更灵活的combine方法,传入逐元素处理的函数即可,比如和combine_first等价的写法是:
    df_c = df_a.combine(df_b, lambda col_a, col_b: col_a.fillna(col_b))
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:09:27