【问题标题】:Cannot read csv file from dask, except if loaded from pandas first无法从 dask 读取 csv 文件,除非先从 pandas 加载
【发布时间】:2020-04-05 00:18:32
【问题描述】:

我有一个非常大的 csv 数据文件,它被分割成更小的块/部分。但是,如果您尝试加载数百万或更多行,pandas 似乎不是一个好主意,因为它实际上已加载到您的 RAM 中(我已经尝试过这个,但内核只是死了)。所以,我正在考虑使用 Dask。现在我熟悉 pandas,但不熟悉 dask。似乎也没有很多关于它的教程。

当我尝试使用 pandas 加载 csv 文件的一部分(大约 60.000~ 行)时,它仍然可以正常工作。问题是当我尝试加载所有部件(数百个)时。我想为此使用 Dask,但即使加载一个部分仍然失败。

import dask.dataframe as dd
import pandas as pd

ddf = dd.read_csv("path/part-000", header=None, blocksize=None)

当我尝试上面的代码时,一开始它似乎工作正常,但之后我所做的所有代码总是导致错误。当我直接从 dask 读取文件时,我似乎也无法放置 npartitions。

len(ddf)

ValueError: Mismatched dtypes found in `pd.read_csv`/`pd.read_table`.

+--------+--------+----------+
| Column | Found  | Expected |
+--------+--------+----------+
| 1      | object | float64  |
| 2      | object | float64  |
| 4      | object | int64    |
+--------+--------+----------+

所以我先从 pandas 加载它,然后将其转换为 dask。

df = pd.read_csv("path/part-000", header=None)
ddf = dd.from_pandas(df,npartitions=64)

它有效,但我不喜欢这种方法,因为就像我说的那样,我将数百万行划分为更小的块/部分,因此将其加载到 pandas 然后将其转换为 dask 听起来效率不高。

所以我的问题可以概括为这个。

  1. 如何在使用blocksizenpartitions 等参数的同时将文件直接加载到Dask?

  2. 如何将大量文件加载到 Dask?在 pandas 中,我通常使用append() 函数,但我不知道这是否是正确的方法。

【问题讨论】:

    标签: python pandas dask


    【解决方案1】:

    Dask 为您提供的其余错误消息提供了一个 dtype= 关键字,以提供给您的 read_csv 调用以确保一切正常(似乎您在这个问题中切断了这一点)。它可能如下所示:

    dtypes={1: object, 2: object, 4:object}
    

    如果您在 read_csv 调用中包含提供的行,那么一切都会正常。

    【讨论】:

    • 感谢您的回复。我把那个参数放在哪里?我尝试了ddf = dd.read_csv("path/part-000", header=None, dtypes={1: object, 2: object,3:object, 4:object,5: object, 6:object}),但仍然出现错误。 TypeError: parser_f() got an unexpected keyword argument 'dtypes'.
    • 有关允许的关键字参数的更多信息,请参见 pandas.read_csv 文档字符串。可能是我选错了名字。
    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2021-06-04
    相关资源
    最近更新 更多