pandas填充指定行缺失日期触发AttributeError如何解决
报错原因
你代码里的问题一共有三处:
- 你已经通过
row['year_of_release']==None判断出当前单元格的值是None类型,而fillna()是pandas 序列/数据表对象才有的方法,单个None值本身不存在这个方法,调用就会触发你看到的AttributeError。 - 自定义函数没有设置返回值,
df.apply(axis=1)是逐行接收函数返回值再拼接成结果列的,没有返回值的话最终整列都会被赋值为空,完全达不到填充效果。 - 函数内的for循环是多余逻辑:
apply(axis=1)本身已经在做逐行遍历,不需要在单行处理逻辑里再循环取字段。另外你原代码里fillna那一行还缺少右括号,就算前面逻辑正确也会触发语法错误。
另外补充一点:pandas中判断空值不要用== None,这种写法无法识别pd.NaT、np.nan等其他类型的空值,兼容性很差,统一用pd.isna()或者序列的.isna()方法判断更稳妥。
修复方案
方案1:修正原有自定义函数逻辑
和你最初的实现思路保持一致,只需要调整函数内的判断和返回逻辑即可:
import pandas as pd def harry_potter_nons(row): if row['name'] == "LEGO Harry Potter: Years 5-7" and pd.isna(row['year_of_release']): return pd.Timestamp('2012-01-01') return row['year_of_release'] gaming['year_of_release'] = gaming.apply(harry_potter_nons, axis=1)
方案2:向量化条件赋值(推荐,性能更好)
pandas做条件赋值优先用向量化操作,不需要逐行循环,数据量越大执行速度比apply快越多,逻辑也更清晰不容易出错:
import pandas as pd # 定义需要填充的行筛选条件 match_mask = (gaming['name'] == "LEGO Harry Potter: Years 5-7") & (gaming['year_of_release'].isna()) # 对符合条件的行直接赋值 gaming.loc[match_mask, 'year_of_release'] = pd.Timestamp('2012-01-01')
结果校验
填充完成后可以执行以下代码确认7条缺失值是否全部填充成功:
# 统计对应游戏下发行日期为空的条目数,返回0就代表填充完成 print(gaming[(gaming['name'] == "LEGO Harry Potter: Years 5-7") & (gaming['year_of_release'].isna())].shape[0])
内容的提问来源于stack exchange,提问作者Maor Ohayon
相关产品推荐
相关产品推荐

