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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:57:21