如何解决pandas.read_sql()自动将bigint转换为float64的问题
问题原因
ID列存在空值时,pandas原生int64类型不支持存储空值,因此从MySQL读取Bigint(20)类型的ID列时,会自动向上转型为float64,进而出现科学计数法显示、转字符串自带.0后缀、直接转int64报非有限值错误的问题。
解决方案
方案1:转换为支持空值的Int64整数类型(推荐)
pandas 0.24及以上版本提供了可空整数类型Int64(首字母大写),既可以保留整数格式,也兼容空值存储:
df['ID'] = df['ID'].astype('Int64')
转换后空值会显示为<NA>,不会出现科学计数法,也支持正常的数值运算、过滤操作。
方案2:转换为不带.0后缀的字符串类型
如果需要字符串格式的ID,可通过判断空值后再做转换:
- 保留空值的写法:
import pandas as pd df['ID'] = df['ID'].apply(lambda x: str(int(x)) if pd.notna(x) else None)
- 空值统一替换为指定占位符(比如空字符串)的写法:
df['ID'] = df['ID'].fillna(0).astype('int64').astype('str').replace('0', '')
源头规避方法
调用pandas.read_sql时直接指定ID列的类型,避免读取阶段自动转型为float64:
from sqlalchemy import BigInteger df = pd.read_sql( sql="你的查询SQL", con=你的数据库连接对象, dtype={"ID": BigInteger()} )
内容的提问来源于stack exchange,提问作者wawawa
相关产品推荐
相关产品推荐

