Pandas如何按条件用其他行值填充NA列 能否用np.where实现
问题解答
完全可以用np.where(含嵌套写法)实现你需要的按列值映射填充缺失值的逻辑,具体实现方式和注意事项如下:
- 核心注意点:直接使用
df.loc[df.C == 'a', ['A', 'B']]作为填充值时,会因为pandas的索引对齐规则(C='a'的行索引和C='e'的行索引不匹配)导致赋值失败返回NaN,需要先把映射基准值提取为无索引的标量。 - 单条映射规则(C列值为'e'时取C='a'对应的A、B值填充,否则保留原值)的实现代码:
import pandas as pd import numpy as np # 原始示例数据 df = pd.DataFrame({'A': [0, 1, np.nan, 3, np.nan], 'B': [5, 6, np.nan, 8, np.nan], 'C': ['a', 'b', 'c', 'd', 'e']}) # 提取C='a'对应的A、B列基准值 ref_a = df.loc[df.C == 'a', 'A'].iloc[0] ref_b = df.loc[df.C == 'a', 'B'].iloc[0] # np.where实现填充 df['A'] = np.where(df['C'] == 'e', ref_a, df['A']) df['B'] = np.where(df['C'] == 'e', ref_b, df['B'])
- 多条映射规则的嵌套
np.where写法:如果你需要新增规则(例如C列值为'c'时取C='b'对应的A、B值填充),直接嵌套np.where层级即可,示例如下:
# 提取第二组映射的基准值 ref_a_c = df.loc[df.C == 'b', 'A'].iloc[0] ref_b_c = df.loc[df.C == 'b', 'B'].iloc[0] # 嵌套np.where实现多规则判断:先判断是否为'e',是则取'a'对应值;否则判断是否为'c',是则取'b'对应值;其余情况保留原值 df['A'] = np.where(df['C'] == 'e', ref_a, np.where(df['C'] == 'c', ref_a_c, df['A'])) df['B'] = np.where(df['C'] == 'e', ref_b, np.where(df['C'] == 'c', ref_b_c, df['B']))
补充提示:如果业务场景中映射规则组数很多,过长的嵌套
np.where可读性会明显下降,这种情况更推荐先构建固定的映射字典,通过map方法批量匹配基准值后填充,代码维护成本更低。
内容的提问来源于stack exchange,提问作者user3527227
相关产品推荐
相关产品推荐

