Jupyter全量运行报NaN转整数ValueError,单独运行单元格正常
问题分析:Jupyter全量运行报错但单独运行单元格正常的原因
核心触发点:全量运行时AGE列存在未处理的NaN值
报错的直接原因是generate_birthdate函数尝试将NaN转换为整数,而浮点型的NaN无法直接转换为整数,从而触发ValueError。
全量运行报错的具体逻辑
- 代码第17-18行仅将
BIRTHDATE为--/--/----的行替换为有效日期,但并未给这些行的AGE列赋值。 - 第19行仅对
~filt(即BIRTHDATE格式有效)的行计算并赋值AGE,filt对应的行(原无效生日的行)的AGE仍为初始状态的NaN(若AGE列是新建或未提前填充,默认会以浮点型NaN表示空值)。 - 第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
相关产品推荐
相关产品推荐

