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

pandas读取CSV文件时如何让int64类型列的空值正常使用null

报错根因
  • 报错来自两类配置的直接冲突:
    1. 配置项keep_default_na=False会把CSV中所有空单元格直接读取为字符串'',不会自动转换为pandas的缺失值对象
    2. 给整数类列指定的np.int64是原生numpy整数类型,本身不支持存储空值,遇到空字符串字面量时无法完成类型转换,直接抛出invalid literal for int() with base 10: ''错误
可落地的解决方案

方案1:替换为支持空值的整数类型(最小改动)

只需要调整之前的类型推断分支,把原生np.int64替换为pandas专门提供的可空整数类型pd.Int64Dtype()(注意首字母大写,该类型原生支持存储空值,和numpy整数的行为完全兼容)。
修改后的核心代码片段:

# 原整数类型判断分支
if col_type[3] == '0':
    inferred_types[col] = np.int64
else:
    inferred_types[col] = np.float64

# 修改为可空整数类型
if col_type[3] == '0':
    inferred_types[col] = pd.Int64Dtype()
else:
    inferred_types[col] = np.float64

该方案不需要修改keep_default_na=False的配置,pandas在识别到目标列的dtype为可空类型时,会自动把空字符串转换为对应类型的缺失值,不会在读取阶段抛错

方案2:全字符串读入后批量做类型转换(最兼容全空列场景)

适配“数据集规模不大、性能非优先考量”的场景,先把所有列读为字符串类型规避读取阶段的类型转换错误,再统一替换空值、完成类型转换:

# 第一步:仅读列名推断类型(保留原有推断逻辑)
columns = pd.read_csv(
    file_name + '.csv', 
    header=0, 
    index_col=1, 
    keep_default_na=False, 
    nrows=0
).columns
# (保留原有inferred_types类型推断逻辑,无需改动)
inferred_types = {}
# ... 原有类型推断的循环逻辑保持不变 ...

# 第二步:全列读为字符串,避免空值触发转换错误
raw_df = pd.read_csv(
    file_name + '.csv',
    header=0,
    index_col=1,
    keep_default_na=False,
    dtype=str
)
# 第三步:把所有空字符串替换为pandas可识别的缺失值
raw_df = raw_df.replace('', pd.NA)
# 第四步:按照之前推断的类型完成批量转换
df = raw_df.astype(inferred_types)

该方案不管列是部分空、还是全空,都不会在读取阶段触发类型转换错误,逻辑上最稳妥

方案3:全空列的兜底类型配置

可以在读取阶段增加判断逻辑:如果列没有任何有效数据(全空),就跳过硬类型指定,直接设置为字符串类型,避免无效转换报错。
补充说明:代码中使用的squeeze=True参数在pandas 2.0+版本中已被废弃,后续可根据需要替换对应写法,避免触发版本警告

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 07:15:04