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

Pandas按条件调用函数填充列np.nan时fillna不生效问题

问题原因
  • 代码使用了链式索引df[(筛选条件)]['a'],这种写法在pandas中会返回原DataFrame的临时副本而非指向原数据的视图,对这个副本执行inplace=True的修改只会作用在临时对象上,执行完就被回收,根本不会写入原DataFrame。
  • 即使解决了链式索引问题,直接传入全量df.apply的返回值做填充也会出现索引对齐问题,不满足筛选条件的行的计算结果会干扰填充逻辑,甚至误改非目标行的值。
正确实现代码

直接通过loc定位原DataFrame的目标行和目标列,仅对符合条件的行执行API调用后赋值,既避免副本问题,也减少不必要的API请求:

import pandas as pd
import numpy as np

# mock dict
d = dict({'v1': 'xxx1', 'v2': 'xxx2'})

def api_res(val):
    # make api call
    res = d.get(val)
    return res

df = pd.DataFrame({
                   'm': ['M1','M2','M3'],
                   'v': ['v1','v2','v3'],
                   'c': [np.nan, 1, np.nan],
                   'a': [np.nan, np.nan, np.nan]
                 })

mlst = ['M1','M2']

# 提前定义筛选掩码
filter_mask = df['m'].isin(mlst) & df['c'].isna()
# 直接定位原df的目标位置赋值
df.loc[filter_mask, 'a'] = df.loc[filter_mask, 'v'].apply(api_res)
执行结果验证

执行后a列结果完全符合预期:

  • 第一行(满足m在mlst中、c为nan):值为xxx1
  • 第二行(c字段值为1,不满足条件):保持np.nan
  • 第三行(m值为M3不在mlst中,不满足条件):保持np.nan

内容的提问来源于stack exchange,提问作者kms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:54:26