繁体   English   中英

通过 dask.dataframe 读取 csv 时处理解析错误

[英]Dealing with Parse Errors when reading in csv via dask.dataframe

我正在处理一个大型 csv 文件(>300 万行,76 列),并决定在转换为 pandas 数据框之前使用 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()

我看到以下错误:

解析错误图像

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

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

我正在寻找的解决方案

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

就在这里。 在阅读完整的 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM