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

如何将含NaN的Pandas float64列转为存储整数的object列?

最优解决方案:使用Pandas可空整数类型Int64

其实你完全不用手动遍历,Pandas早就为这种场景提供了专门的解决方案——可空整数类型Int64(注意是大写的I),它既能保留整数的类型特性,又能兼容NaN值,而且在to_sql时可以直接映射到数据库的可空整数列,比转成object类型要规范得多。

步骤示例:

假设你的DataFrame是这样的:

import pandas as pd
import numpy as np

df = pd.DataFrame({'int_col': [1.0, 3.0, np.nan, 5.0, 7.0]})
print(df.dtypes)
# int_col    float64
# dtype: object

直接用astype转换为Int64类型:

df['int_col'] = df['int_col'].astype('Int64')

# 查看结果
print(df.dtypes)
# int_col    Int64
# dtype: object
print(df)
#    int_col
# 0        1
# 1        3
# 2      NaN
# 3        5
# 4        7

这个操作完全是向量化的,没有手动遍历,效率极高。而且Int64类型是Pandas的扩展数据类型,底层用高效的数组存储,比object类型(存储Python整数对象)内存占用更小、运算更快。

如果确实需要转为object类型(不推荐):

如果你因为某些限制必须转成object类型,也可以用apply配合pd.notna来处理,Pandas的apply是经过优化的,比手动写for循环高效得多:

df['int_col'] = df['int_col'].apply(lambda x: int(x) if pd.notna(x) else x)

print(df.dtypes)
# int_col    object
# dtype: object
print(df)
#    int_col
# 0        1
# 1        3
# 2      NaN
# 3        5
# 4        7

为什么推荐Int64而不是object?

  1. 类型安全:Int64会强制检查数据是否为整数(转换时如果有非整数的float值会报错,比如2.5会抛出错误,避免脏数据),而object类型允许任意类型混入,容易埋下隐患。
  2. 性能更优:Int64是基于数组的存储,和普通int64类型性能接近;object类型存储的是Python对象,内存占用大,运算速度慢。
  3. SQL映射友好:使用to_sql时,Int64会自动映射到数据库的可空整数类型(比如PostgreSQL的INT NULL、MySQL的INT(11) NULL等),而object类型可能会被识别为字符串类型,需要额外指定dtype参数,反而更麻烦。

内容的提问来源于stack exchange,提问作者Jon Claus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:08:23