如何用Pandas批量为多列填充对应特定列的缺失值?
一次性用对应列填充多列缺失值的高效方法
嘿,我懂你的痛点——单独写一堆np.where来给每列填缺失值太繁琐了,想找个一次性搞定的办法对吧?其实用Pandas自带的方法就能轻松实现,而且比逐列写np.where更简洁高效。
核心思路
先定义一个填充规则字典,把需要填充的列(目标列)和用来填充的参考列一一对应起来,然后通过循环或者字典推导式批量处理。
具体实现步骤
1. 定义填充规则字典
比如你的场景里,BASE_B缺值用BASE_S填,假设还有BASE_C缺值用BASE_D填,就可以这么写:
fill_rules = { 'BASE_B': 'BASE_S', 'BASE_C': 'BASE_D' # 可以继续添加更多列的对应关系 }
2. 批量填充缺失值
用Pandas的fillna()方法,直接传入对应参考列的Series作为填充值,循环处理每个目标列:
for target_col, source_col in fill_rules.items(): result1_copy[target_col] = result1_copy[target_col].fillna(result1_copy[source_col])
如果你喜欢更简洁的写法,也可以用assign()配合字典推导式:
result1_copy = result1_copy.assign(**{ col: result1_copy[col].fillna(result1_copy[fill_rules[col]]) for col in fill_rules })
示例验证
我们用一组测试数据来看看效果:
import pandas as pd import numpy as np # 构造测试数据 data = { 'BASE_B': [1, np.nan, 3, np.nan], 'BASE_S': [10, 20, 30, 40], 'BASE_C': [np.nan, 5, np.nan, 7], 'BASE_D': [50, 60, 70, 80] } result1_copy = pd.DataFrame(data) # 应用填充规则 fill_rules = {'BASE_B': 'BASE_S', 'BASE_C': 'BASE_D'} for target, source in fill_rules.items(): result1_copy[target] = result1_copy[target].fillna(result1_copy[source]) print(result1_copy)
输出结果:
BASE_B BASE_S BASE_C BASE_D 0 1.0 10 50.0 50 1 20.0 20 5.0 60 2 3.0 30 70.0 70 3 40.0 40 7.0 80
可以看到,BASE_B的缺失值被BASE_S对应行的值填上了,BASE_C的缺失值也被BASE_D对应行的值完美填充,完全符合你的需求。
补充说明
如果你的场景里除了填充缺失值,还有额外的条件判断(比如不是所有缺值都用对应列填,而是满足某些条件才填),那可以把fillna()换成np.where,放在循环里同样能批量处理:
for target_col, source_col in fill_rules.items(): result1_copy[target_col] = np.where( pd.isnull(result1_copy[target_col]), # 判断是否缺值 result1_copy[source_col], # 缺值时用参考列填充 result1_copy[target_col] # 不缺值时保留原值 )
这种写法和你原来的逐列写法逻辑一致,但通过循环避免了重复代码,维护起来更方便。
内容的提问来源于stack exchange,提问作者asimo
相关产品推荐
相关产品推荐

