簡體   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