pandas读取CSV文件时如何让int64类型列的空值正常使用null
报错根因
- 报错来自两类配置的直接冲突:
- 配置项
keep_default_na=False会把CSV中所有空单元格直接读取为字符串'',不会自动转换为pandas的缺失值对象 - 给整数类列指定的
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
相关产品推荐
相关产品推荐

