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
相关产品推荐
相关产品推荐

