You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:52:49