Pandas astype()强制转换数据类型引发数据突变的技术咨询
问题原因
- 数据突变是int32类型溢出导致的:int32的取值上限为2147483647,你原数据第7-9行的数值(3415195000、3669382000、2531232000)均超出该范围,强制转换时触发整数循环溢出,最终显示为负数。
- Pandas中
astype(int)未指定具体类型时,部分环境会默认映射为int32而非int64,这是类型降级的直接原因。
操作中的问题
- 未明确指定转换为int64类型,依赖Pandas自动推断导致类型降级,引发溢出。
- 针对sqlite3导出的带.0的浮点数,直接用
astype(int)的处理方式不够严谨,既未校验数据是否为合法整数,也未明确类型规格。
解决方案
- 明确指定int64类型转换:
DF_DTYPES = {'is_inco_oper': 'int64'} df = df.astype(DF_DTYPES) - 安全处理sqlite3导出的浮点数:
使用pd.to_numeric做类型转换,同时校验数据完整性:# 自动向下兼容合适的整数类型,同时抛出异常处理非法值 df['is_inco_oper'] = pd.to_numeric(df['is_inco_oper'], downcast='integer', errors='raise') # 或先校验所有值均为整数,再转换为int64 assert df['is_inco_oper'].apply(lambda x: x.is_integer()).all(), "存在非整数数值" df['is_inco_oper'] = df['is_inco_oper'].astype('int64') - 创建DataFrame时提前指定类型:
从字典生成DataFrame时直接指定列类型,避免后续转换操作:df = pd.DataFrame.from_dict(dictionary, dtype={'is_inco_oper': 'int64'})
内容的提问来源于stack exchange,提问作者David Hajes
相关产品推荐
相关产品推荐

