pandas使用fillna处理列空值未生效 赋值后触发KeyError问题
问题根因拆解
两次操作分别踩了pandas的两个典型使用误区:
误区1:fillna未生效,空值统计前后无变化
pandas中绝大多数数据转换类方法(包括fillna、replace、apply等)默认不会直接修改原始数据对象,而是返回一个完成转换的副本。
你第一次写的df['col'].fillna(value='no_val')仅在内存中生成了一个填充完成的一维列副本,既没有把这个副本赋值回原列,也没有开启原地修改参数,原始df里的col列完全没有被改动,后续统计空值自然和初始结果完全一致。
对应正确的实现写法:
- 显式将fillna返回的副本赋值回原列,这也是pandas官方推荐的写法:
df['col'] = df['col'].fillna(value='no_val') - 开启原地修改参数直接改动原列:
df['col'].fillna(value='no_val', inplace=True)
注:pandas新版本中
inplace参数已被标记为不推荐使用,长期维护代码更建议采用显式赋值的写法
误区2:修改代码后抛出col字段的KeyError
df['col']本身是一个从二维DataFrame中取出的一维Series对象,不是完整的二维DataFrame结构。
你写的df = df['col'].fillna(value='no_val')这行,实际是把填充完成的单列Series直接覆盖了原本存储二维DataFrame的变量df:此时df已经从多列的表结构变成了单维度的行索引结构,既丢失了其他所有列数据,也不存在名为col的列维度。后续代码再用df['col']访问字段时,自然会因为找不到对应的列名抛出KeyError。
注意:如果要对单列做填充,绝对不要把单列的返回值直接赋值回整个DataFrame变量,只需要把结果赋值回原列位置即可。
内容的提问来源于stack exchange,提问作者user13067694
相关产品推荐
相关产品推荐

