在Pandas的数据处理场景中,整数列包含None值是非常常见的情况,默认的整数类型无法存储缺失值,因此Pandas会自动将整数列转换为浮点数类型,这往往不符合我们的预期。比如我们有一组包含缺失值的整数数据,读取后类型就发生了变化。

问题复现
我们首先构造一个包含None值的整数数组,查看其默认的类型转换情况:
import pandas as pd import numpy as np # 构造含None值的整数列表 data = [1, 2, None, 4, 5] # 转换为Series s = pd.Series(data) # 查看数据类型 print(s.dtype) # 查看数据内容 print(s)
运行上述代码后,输出的数据类型为float64,原本的整数1、2等都被转换为了1.0、2.0这样的浮点数形式,这是因为Pandas的默认整数类型int64不支持存储None值,所以自动升级为可以存储缺失值的浮点数类型。
解决方案一:使用可空整数类型
Pandas从0.24版本开始引入了可空整数类型,专门用来处理包含缺失值的整数数据,这类类型的后缀为Int64(注意首字母大写),可以存储整数和缺失值,不会自动转换为浮点数。
import pandas as pd data = [1, 2, None, 4, 5] # 指定数据类型为可空整数类型Int64 s = pd.Series(data, dtype="Int64") print(s.dtype) print(s)
运行后可以看到数据类型为Int64,数据内容中的整数仍然保持整数形式,None值会被标记为<NA>,既保留了整数类型,又正确处理了缺失值。
解决方案二:替换None值为整数标记
如果业务场景中可以用某个特殊的整数值来代表缺失值,比如用-1或者0作为缺失标记,那么可以将None值替换为对应的整数,这样整个列就可以保持普通的整数类型。
import pandas as pd import numpy as np data = [1, 2, None, 4, 5] s = pd.Series(data) # 将None值替换为-1,默认转换后的浮点数-1.0转为整数 s = s.fillna(-1).astype(int) print(s.dtype) print(s)
这种方法适合缺失值可以用特定整数表示的场景,但是需要注意后续分析时要排除这些标记值,避免影响计算结果。
解决方案三:分列存储缺失标记
如果需要严格区分缺失值和正常整数,还可以将原来的整数列拆分为两个整数列,一个存储实际的整数值,另一个用布尔类型标记是否为缺失值。
import pandas as pd
data = [1, 2, None, 4, 5]
s = pd.Series(data, dtype="Int64")
# 提取整数值,缺失值填充为0(仅用于提取)
value_col = s.fillna(0).astype(int)
# 生成缺失标记列
mask_col = s.isna()
# 组合为DataFrame
df = pd.DataFrame({"value": value_col, "is_missing": mask_col})
print(df.dtypes)
print(df)
这种方式适合对数据精度要求很高的场景,虽然增加了列数,但是可以完全保留原始数据的所有信息,后续处理时可以根据缺失标记灵活处理。
不同方案对比
我们可以通过下表对比三种方案的适用场景和优缺点:
| 方案 | 数据类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 可空整数类型 | Int64 | 原生支持缺失值,无需额外处理 | 部分旧版本Pandas不支持 | 大多数常规含缺失值的整数处理场景 |
| 替换为整数标记 | int64 | 兼容性好,所有Pandas版本支持 | 需要自定义标记值,可能影响计算 | 缺失值可以用特定整数表示的场景 |
| 分列存储 | int64 + bool | 信息完整,无精度损失 | 增加列数,处理逻辑更复杂 | 对数据精度要求极高的场景 |
注意事项
在使用可空整数类型时,需要注意和普通的int64类型的区别:
- 可空整数类型的缺失值标记为
<NA>,不是None或者np.nan - 可空整数类型参与运算时,如果结果包含缺失值,仍然会保持
Int64类型 - 部分Pandas的旧函数可能不支持可空整数类型,遇到兼容性问题可以临时转换为普通类型处理
另外如果数据是从文件读取的,可以在读取时直接指定数据类型为可空整数类型,避免后续再转换:
import pandas as pd
# 读取csv时指定列类型为可空整数
df = pd.read_csv("test.csv", dtype={"score": "Int64"})
print(df.dtypes)
PandasNone值处理整数数组数据类型转换nullable_integer修改时间:2026-06-12 15:21:29