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

Pandas填充NaN为0后仍报Cannot convert float NaN to integer错误如何解决

问题排查与解决思路

核心错误原因

  • pandas的replace、fillna方法默认返回新的Series对象,你没有将处理结果赋值回原Frequency列,也没有设置inplace=True,所以原始空值、Never、Every day都没有被修改,原列中仍保留NaN,导致后续类型转换报错。
  • 你直接将空值fillna(0)为整数0,后续调用.str开头的字符串专属方法时,非字符串类型的0会被转为新的NaN,进一步加剧了空值问题。

修正代码

import pandas as pd 

# 第一步:统一预处理字符串字段,避免数值混入导致字符串操作返回NaN
# 空值先统一替换为Never,和原枚举逻辑对齐
AlcData['Frequency'] = AlcData['Frequency'].fillna('Never')
# 批量替换特殊枚举值,直接赋值回原列生效
AlcData['Frequency'] = AlcData['Frequency'].replace({
    'Every day': '365 times per year',
    'Never': '0 times per year'
})

# 第二步:拆分计算年平均次数
# 映射周期对应的年乘数
period_coef = AlcData['Frequency'].str.split().str[-1].map({'week': 52, 'month': 12, 'year': 1})
# 提取次数区间的平均值,先转float避免无意义的int转换报错
num_avg = AlcData['Frequency'].str.extract(r'(\d+)\D*(\d+)?').ffill(axis=1).astype(float).mean(axis=1)
# 计算最终结果
AlcData['annual_frequency'] = period_coef * num_avg

验证逻辑

转换后的值完全匹配预期:

  • Never/空值 → 0
  • 1-2 times per year → (1+2)/2 *1 = 1.5
  • 3-4 times per month → (3+4)/2 *12 = 42
  • Every day → 365 *1 = 365
  • 1-2 times per week → (1+2)/2 *52 =78

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:30:01