【问题标题】:Dealing with Parse Errors when reading in csv via dask.dataframe通过 dask.dataframe 读取 csv 时处理解析错误
【发布时间】:2022-12-09 05:47:20
【问题描述】:

我正在处理一个巨大的 csv 文件(>300 万行,76 列),并决定在转换为熊猫数据帧之前使用 dask 读取数据。

但是,我遇到了一个问题,即最后一列中的列出血。请参阅下面的代码和错误。

import dask.dataframe as dd
import pandas as pd


dataframe = dd.read_csv("SAS url",
                       delimiter = ",", 
                       encoding = "UTF-8", blocksize = 25e6,
                       engine = 'python') 


然后查看我使用的所有列是否都存在

dataframe.columns

使用时


dataframe.compute()

我看到以下错误:

ParseError image

使用 read_csv 参数 error_bad_lines = False 时,它显示许多行有 77 或 78 个字段,而不是预期的 76 个。

注意:遗憾的是,忽略这些错误的行不是一种选择。

我正在寻求的解决方案

有没有办法保留所有字段并在必要时将这些额外字段附加到新列?

【问题讨论】:

  • 要做什么取决于为什么这些行有额外的“列”。是因为它们实际上具有额外的价值吗?或者是不是某些值包含定界符并且没有正确引用它们。如果是后者,那么你对这些行的问题不仅仅是几个额外的值。对于格式不正确的行,您真的不知道应该将哪些值放入哪些变量中。

标签: python pandas dask-dataframe


【解决方案1】:

就在这里。在阅读完整的 CSV 之前,您可以使用 names= 参数添加额外的列。我没有用 Dask 尝试过这个,但是 Dask read_csv 在幕后调用 Pandas read_csv 所以这也应该适用于 dd.read_csv。

使用模拟 CSV 文件进行演示:

sim_csv = io.StringIO(
'''A,B,C
11,21,31
12,22,32
13,23,33,43,53
14,24,34
15,25,35'''
)

默认情况下,read_csv 失败:

df = pd.read_csv(sim_csv)

ParserError: Error tokenizing data. C error: Expected 3 fields in line 4, saw 5

捕获列名称:

sim_csv.seek(0)    # Not needed for a real CSV file
df = pd.read_csv(sim_csv, nrows=1)

save_cols = df.columns.to_list()

将几个列名称添加到名称列表的末尾并阅读您的 CSV:

sim_csv.seek(0)    # Not needed for a real CSV file
df = pd.read_csv(sim_csv, skiprows=1, names=save_cols+['D','E'])

df

    A   B   C     D     E
0  11  21  31   NaN   NaN
1  12  22  32   NaN   NaN
2  13  23  33  43.0  53.0
3  14  24  34   NaN   NaN
4  15  25  35   NaN   NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多