为何Pandas中fillna按行用字典填充报错,replace替换NaN却正常?
嘿,这个问题我之前调试代码的时候也踩过坑,咱们一步步理清楚为啥会这样哈!
先说说为啥fillna会报错
你用的df.fillna(value={'A': 'not existed'}, axis=1, inplace=True)里,axis=1是关键问题!
pandas的fillna函数中,axis参数直接决定了填充的匹配逻辑:
- 当
axis=0(默认值,按列填充):value传入的字典,key需要是列名,对应填充该列的所有NaN,这时候你写{'A': 'not existed'}完全没问题,甚至不需要加axis=1。 - 但当你指定
axis=1(按行填充):value的字典key需要是行索引,用来填充对应行的所有NaN。这时候你传入列名'A'当key,pandas就找不到对应的行索引匹配,自然抛出那个NotImplementedError,提示你按行填充的场景下,没法用列名的字典来指定填充值。
简单说,你加了axis=1,就把填充逻辑从「按列匹配列名」改成了「按行匹配行索引」,但你的字典还是按列名写的,完全不匹配,所以触发了错误。
再说说为啥replace能正常运行
你用的df['A'].replace(np.nan, 'not existed'),是直接针对**单个列'A'**操作的:
- 首先你已经通过
df['A']选中了目标列,不需要再考虑全局的axis参数; replace的逻辑很直接:把该列中所有等于np.nan的值替换成指定字符串,而且它允许跨类型替换(原来的列是float类型,替换后会自动变成object类型,容纳字符串),所以完全不会有问题。
补个正确的fillna用法
其实你如果去掉axis=1,用默认的axis=0,代码就能正常运行:
df.fillna(value={'A': 'not existed'}, inplace=True)
这样pandas就会找到列'A',把里面的NaN全部替换成'not existed',和replace的效果是一致的。
内容的提问来源于stack exchange,提问作者daiyue
相关产品推荐
相关产品推荐

