pandas 如何在 read_csv 时强制某些列为 nullable integer 类型

6次阅读

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

pandas 如何在 read_csv 时强制某些列为 nullable integer 类型

为什么 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 pd 

df = 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") 显式降级。

text=ZqhQzanResources