Python使用read_sql_table时保留NaN并将浮点型转为整型的方案
解决read_sql_table读取带NULL的整数列自动转为浮点型的问题
我完全懂你的困扰——明明是整数列,就因为SQL里存在NULL值,读进pandas后直接变成了浮点型;先填0转整型再还原NaN,结果又被打回浮点型,来回折腾太麻烦了。其实从pandas 1.0版本开始,就有专门的Nullable Integer类型(注意是大写的Int64,区别于原生的int64),完美适配带缺失值的整数场景,能直接解决你的需求。
直接读取时指定可空整型dtype
不需要先填充NaN再转换,你可以在调用read_sql_table时,通过dtype参数直接指定目标列的类型为Int64。这样读取后的数据会保留原始的NULL值,同时列类型是可空整型,不会自动转成浮点型。
示例代码:
import pandas as pd from sqlalchemy import create_engine # 初始化数据库连接(替换成你的实际连接串) engine = create_engine('your_database_connection_string') # 读取表时指定列的可空整型类型 df = pd.read_sql_table( 'your_table_name', # 替换成你的表名 engine, dtype={ 'column1': 'Int64', 'column2': 'Int64', 'column3': 'Int64' } )
验证结果
执行后用df.dtypes查看列类型,会显示Int64而非float64;原始的NULL值会被保留为pd.NA(和np.nan兼容,是pandas专属的缺失值标识),完全省去后续填充、替换的步骤。
老版本pandas的兼容方案
如果你的pandas版本低于1.0,没法直接用Int64类型,可以先读取为浮点型,再直接转换为可空整型(不需要填充0):
df = pd.read_sql_table('your_table_name', engine) df[['column1', 'column2', 'column3']] = df[['column1', 'column2', 'column3']].astype('Int64')
这样也能把浮点列转成带NaN的整型列,避开了无效的中间操作。
为什么之前的方法会转回浮点型?
普通的int64类型不支持存储缺失值,当你把0替换成np.nan时,pandas只能自动将列类型转为float64——因为只有浮点型才能容纳NaN。而Int64是pandas专门设计的扩展类型,底层支持同时存储整数和缺失值,所以不会出现类型回退的问题。
内容的提问来源于stack exchange,提问作者omdurg
相关产品推荐
相关产品推荐

