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
相关产品推荐
相关产品推荐

