read_csv 默认不推断 nullable integer(如 Int64)是因为其默认整数类型 int64 不支持 NaN,遇缺失值即退化为 float64;Int64 虽支持整数+NaN,但需显式指定 dtype 或配合 na_values、converters 处理脏数据。

为什么 read_csv 默认不推断 nullable integer(如 Int64)?
pandas 的默认整数类型是 int64,它不能容纳 NaN;一旦列里有缺失值,read_csv 就会退化为 float64。而 Int64(首字母大写)是 pandas 的 nullable integer 类型,专为“整数 + NaN”设计,但不会被自动选中——必须显式指定。
用 dtype 参数直接指定 Int64
最直接的方式是在调用 read_csv 时通过 dtype 字典声明目标列为 "Int64"(字符串形式)或 pd.Int64Dtype()(对象形式):
import pandas as pddf = pd.read_csv("data.csv", dtype={"age": "Int64", "user_id": "Int64"})
-
"Int64"字符串写法更简洁,推荐用于简单场景 - 若列名含空格或特殊字符,必须用字符串键匹配原始列名
- 如果该列实际包含无法转为整数的值(如
"N/A"、"missing"),会报ValueError: Integer column has NA values—— 此时需先用na_values告诉 pandas 哪些字符串算缺失
配合 na_values 处理非标准缺失标识
很多 CSV 用 "NULL"、"\N"、"-999" 表示缺失,pandas 默认不认识这些。若不提前声明,Int64 转换会失败:
df = pd.read_csv(
"data.csv",
dtype={"score": "Int64"},
na_values=["NULL", "\\N", "-999"]
)-
na_values必须在dtype之前生效,否则解析阶段已把非法字符串当有效值读入,后续转Int64就会崩 - 注意:
na_values是全局设置,会影响所有列;若只想对某列生效,得先用converters预处理
用 converters 实现更灵活的 per-column 类型控制
当某列混合了整数、空字符串、标记符(如 "NA"),且 na_values 不够用时,可用 converters 手动清洗后再转 Int64:
def to_nullable_int(x):
if pd.isna(x) or x in ["", "NA", "NULL"]:
return pd.NA
try:
return int(x)
except (ValueError, TypeError):
return pd.NA
df = pd.read_csv(
"data.csv",
converters={"flag": to_nullable_int},
dtype={"flag": "Int64"} # 这行其实可省,因 converter 已返回 pd.NA + int
)
-
converters优先级高于dtype,适合做脏数据兜底 - 返回
pd.NA是关键,只有这样后续列才能被正确识别为 nullable 类型 - 性能略低,大数据量时慎用
真正容易被忽略的是:nullable integer 类型在 groupby、merge、fillna 等操作中行为和普通 int 不同,比如 fillna(0) 后类型仍为 Int64,但 astype(int) 会直接报错——得用 astype("Int64").fillna(0).astype("int64") 显式降级。










