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

Jupyter全量运行报NaN转整数ValueError,单独运行单元格正常

问题分析:Jupyter全量运行报错但单独运行单元格正常的原因

核心触发点:全量运行时AGE列存在未处理的NaN值

报错的直接原因是generate_birthdate函数尝试将NaN转换为整数,而浮点型的NaN无法直接转换为整数,从而触发ValueError。

全量运行报错的具体逻辑

  1. 代码第17-18行仅将BIRTHDATE为--/--/----的行替换为有效日期,但并未给这些行的AGE列赋值。
  2. 第19行仅对~filt(即BIRTHDATE格式有效)的行计算并赋值AGE,filt对应的行(原无效生日的行)的AGE仍为初始状态的NaN(若AGE列是新建或未提前填充,默认会以浮点型NaN表示空值)。
  3. 第20行调用df_good_ssn['AGE'].apply(generate_birthdate)时,是对整个AGE列的所有行执行函数,包括那些AGE为NaN的行,此时函数执行int(age)就会触发转换错误。

单独运行单元格正常的原因

当单独重新运行该单元格时,df_good_ssn的状态已发生变化:

  • 可能之前的运行已经给filt行的AGE赋值(比如报错后手动修复,或重复运行时隐式保留了状态);
  • 或多次运行后,AGE列的NaN被意外填充,使得apply遍历过程中不会遇到NaN值,函数得以正常执行。

代码修复建议

方案1:仅对有效AGE行应用函数

将第20行修改为仅处理~filt的AGE子集,避免触碰到NaN行:

df_good_ssn.loc[~filt,'NEW_BIRTHDATE'] = df_good_ssn.loc[~filt,'AGE'].apply(generate_birthdate)

方案2:在函数中增加NaN判断

在generate_birthdate函数里提前处理NaN情况,避免转换错误:

def generate_birthdate(age):   
    today = date.today()
    if pd.isna(age):
        # 针对NaN的默认处理逻辑,示例返回固定日期
        return '01/01/2000'
    if int(age) < 18:
        new_birthdate = str(random.randrange(1,12))+'/'+str(random.randrange(1,28))+'/'+str(random.randrange(today.year-18,today.year))
    else:
        new_birthdate = str(random.randrange(1,12))+'/'+str(random.randrange(1,28))+'/'+str(random.randrange(today.year-90,today.year-18))
    return new_birthdate

内容的提问来源于stack exchange,提问作者JoBaxter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:35:20