使用pandas的read_csv读取CSV文件时出现源文件不存在的浮点值如何解决
你遇到的问题是pandas读取无表头CSV的默认规则、自动类型推断逻辑,再加上CSV生成过程的小问题共同导致的,具体原因和解决方法如下:
- 核心原因1:无表头CSV读取逻辑问题
pandas默认会把CSV的第一行识别为列名,如果你生成的CSV没有专门写表头、所有行都是数据,那么读取时第一行数据会被当成列名,pandas会自动生成0开始的数值索引作为数据行的标识,同时如果行数据存在错位、空值,就会出现你看到的额外浮点值。
解决方案:读取时指定header=None参数,告知pandas该CSV没有表头,所有行都是数据:
import pandas as pd df = pd.read_csv("custom-data.csv", header=None)
- 核心原因2:pandas自动类型推断导致整数转浮点
pandas的默认int类型不支持空值(NaN),如果CSV中存在空值、空行、行尾多余逗号生成的空字段,pandas会把整列的数据类型向上推导为float,原本的整数值会变成带.0的浮点数,空值会变成NaN浮点值。
解决方案1:读取时指定使用支持空值的整数类型Int64,避免自动转浮点:
df = pd.read_csv("custom-data.csv", header=None, dtype="Int64")
解决方案2:如果你的数据是固定列数(比如手写数字识别常用的784列像素值),读取时指定列数,忽略多余的空列:
# 784可以替换为你实际的列数 df = pd.read_csv("custom-data.csv", header=None, dtype="Int64", usecols=range(784))
解决方案3:如果已经读入了数据,可以直接删除全为空的列:
df = df.dropna(axis=1, how="all")
- 核心原因3:CSV生成代码的可优化点
你当前的CSV生成代码有两个小问题可能会导致异常:
- 使用
with语句打开文件时,会在代码块执行结束后自动关闭文件,不需要手动调用close()方法,重复关闭可能会引发意料之外的IO问题 - 如果
preprocessed_digits[0][0]是numpy数组,直接传入writerow可能会因为numpy的数值类型特性引发写入异常,建议先转成普通Python列表再写入
优化后的写入代码示例:
from csv import writer # 先将numpy数组转为普通int列表 write_row = preprocessed_digits[0][0].tolist() with open('/content/drive/My Drive/Colab Notebooks/digit-recognition/custom-data.csv', 'a') as f_object: writer_object = writer(f_object) writer_object.writerow(write_row)
内容的提问来源于stack exchange,提问作者sunny
相关产品推荐
相关产品推荐

