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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:39:50