Pandas Series从float转int后重新赋值不生效问题
问题解决方法
问题根源
- pandas中int类型无法存储NaN值,所以当列存在NaN时,会自动转为float类型。你遇到的500条NaN行,大概率是读取CSV时参数设置问题(比如空白行被识别为NaN、特定字符被误解析为缺失值)。
- 直接执行
df['ID'] = df['ID'].dropna().astype(int)无效,是因为dropna()返回的是删除NaN后的短Series,赋值时原DataFrame中未被删除的NaN行依然存在,导致列类型被迫转回float。
解决方案
方案1:保留NaN行,使用支持缺失值的整数类型
pandas提供了Int64(大写I)可空整数类型,既能存储整数,又能兼容NaN:
# 直接转换为可空整数类型 df['ID'] = df['ID'].astype('Int64')
转换后,有效数据显示为整数,NaN行保留,列类型为Int64而非float。
方案2:彻底删除NaN行后转类型
如果不需要保留NaN行,先删除对应行再转换类型:
# 删除ID列含NaN的行 df = df.dropna(subset=['ID']) # 转换为int类型 df['ID'] = df['ID'].astype(int)
此时整个列无NaN,可稳定保持int类型。
额外排查:解决CSV读取时的NaN问题
如果原CSV没有NaN但读入后出现,检查pd.read_csv的参数:
- 添加
skip_blank_lines=True(默认开启,但可显式设置)跳过空白行 - 通过
na_values指定哪些字符会被识别为NaN,避免误解析:df = pd.read_csv('your_file.csv', na_values=['', 'NA'])
内容的提问来源于stack exchange,提问作者Adka
相关产品推荐
相关产品推荐

