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
相关产品推荐
相关产品推荐

