在使用pandas读取CSV文件时,如果某一列是整数类型但存在缺失值,默认的int类型无法存储NaN,会导致该列被自动转换为float类型,这往往不符合数据处理的需求。此时需要在read_csv阶段就将该列指定为nullable integer类型,也就是pandas的Int64、Int32等可空整数类型,既保留整数属性,又能存储缺失值。

方法一:使用dtype参数直接指定
read_csv提供了dtype参数,可以直接指定每一列的数据类型,对于可空整数类型,直接传入对应的Int64等类型即可。需要注意的是,这里要使用的是pandas的可空整数类型,而不是Python内置的int。
import pandas as pd
import io
# 模拟CSV数据,age列存在缺失值
csv_data = """name,age,score
Alice,25,90
Bob,,85
Charlie,30,88
"""
# 使用dtype指定age列为可空整数类型Int64
df = pd.read_csv(io.StringIO(csv_data), dtype={"age": pd.Int64Dtype()})
print(df.dtypes)
print(df)
上述代码中,pd.Int64Dtype()表示64位可空整数类型,读取后age列的类型为Int64,缺失值会显示为<NA>而不是NaN,且列中存储的是整数。
方法二:使用converters参数自定义转换逻辑
如果需要在转换时做更多自定义处理,比如对异常值进行过滤或者补充默认值,可以使用converters参数,为指定列传入一个转换函数,函数内部将值转换为可空整数类型。
import pandas as pd
import io
csv_data = """name,age,score
Alice,25,90
Bob,,85
Charlie,30,88
"""
def convert_to_nullable_int(value):
# 如果值为空,返回pd.NA
if pd.isna(value) or value.strip() == "":
return pd.NA
# 转换为整数后返回可空整数类型
return pd.Int64Dtype()(int(value))
df = pd.read_csv(io.StringIO(csv_data), converters={"age": convert_to_nullable_int})
print(df.dtypes)
print(df)
这种方式灵活性更高,可以在转换函数中加入额外的校验逻辑,比如过滤非数字的内容,再转换为可空整数类型。
方法三:结合usecols和后续转换(不推荐但适用特殊场景)
如果CSV的列数很多,且只需要对少数几列做可空整数转换,也可以先读取所有列,再对目标列做类型转换,但这种方式不是read_csv阶段直接完成,仅适用于无法在read_csv时指定类型的特殊场景。
import pandas as pd import io csv_data = """name,age,score Alice,25,90 Bob,,85 Charlie,30,88 """ df = pd.read_csv(io.StringIO(csv_data)) # 读取后转换age列为可空整数类型 df["age"] = df["age"].astype(pd.Int64Dtype()) print(df.dtypes)
注意事项
- 可空整数类型的首字母是大写的I,比如Int64,和内置的int类型区分开,小写int是不可空的。
- 如果CSV中该列存在非数字的字符串,直接指定dtype会报错,此时需要先使用converters做清洗再转换。
- 可空整数类型的缺失值用pd.NA表示,和float列的NaN不同,后续做数值计算时需要注意兼容性。
pandasread_csvnullable_integer数据类型转换修改时间:2026-06-27 01:15:17