Pandas如何使用另一列非空值填充指定列的NaN缺失值
Pandas merge后同名列按规则填充实现
需求说明
Pandas做merge操作时如果两表存在同名列,会自动生成带_x、_y后缀的两列,本次填充规则为:
- 保留
col_x列所有原有非空值 - 仅当
col_x对应行值为NaN、且同行col_y值非空时,用col_y的值填充col_x的空位置
可复现测试样例
测试数据(补全原示例缺失的numpy依赖导入):
import pandas as pd import numpy as np df = pd.DataFrame({ 'i': [0, 1, 2, 3], 'c': [np.nan, {'a':'A'}, np.nan, {'b':'B'}], 'd': [{'c':'C'}, np.nan, {'d':'D'}, np.nan] })
样例中c对应待填充的col_x,d对应填充值来源col_y,期望输出为:
i c d 0 0 {'c':'C'} {'c':'C'} 1 1 {'a':'A'} NaN 2 2 {'d':'D'} {'d':'D'} 3 3 {'b':'B'} NaN
实现代码
核心逻辑仅需1行,调用Pandas自带的fillna方法即可:
# 把列名替换成你自己merge后生成的_x、_y列名即可 df['c'] = df['c'].fillna(df['d'])
逻辑说明
fillna传入同长度、同索引的Series时,会逐行匹配填充:仅当前列值为NaN的位置,才会取传入Series对应行的值替换- 原列非空值不会做任何修改,完全保留
- 如果某行
col_x和col_y均为NaN,填充后该位置仍为NaN,不会产生异常值 - 填充完成后如果不需要保留
col_y列,直接执行df.drop(columns=['d'])(替换成你的_y列名)即可删除冗余列。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

