使用 Dask 读取参差不齐的 CSV 会产生 DtypeWarning - 在加载时忽略 "nan" 的选项?

Ragged CSV read with Dask produces DtypeWarning - option to ignore "nan" on load?

我正在尝试使用 Dask 读取一个约 500MB 的大型 CSV 文件,该文件包含一对同时读取的 float 和 str 列,导致一次将两个列表读入内存。这没有错误,但我得到了一个 DtypeWarning,因为它是一个参差不齐的 CSV(列长度在对之间有很大差异)并且它在我可以过滤之前将 nan(float)与字符串混合然后使用.dropna()。

数据结构(在实践中要大得多):

Col1: [1, 2, 3, 4, nan, nan, nan] -> (ok, no warning)
Col2: ['A', 'B', 'C', 'D', nan, nan, nan] -> (mixed str and float; DtypeWarning)

我想避免使用 low_memory=False,因为这会显着影响执行时间(慢 6 倍),但不只是忽略错误感觉是个好习惯。

有没有办法改进下面的示例代码以防止出现上述警告?

import pandas as pd
import dask.dataframe as dd
    
length = 10000000
ratio = 0.9
A = {'A': [0.07]*length, 'B': ['a']*int(length*ratio) + [float('nan')]*(length-int(length*ratio))}
pd.DataFrame(A).to_csv('testing.csv')
df = dd.read_csv('testing.csv')['B'].compute().dropna().tolist()

一些建议:

  1. 如果文件适合内存,通常使用普通 pandas 更方便。 dask 的并行处理的好处开始用于大 tasks/files。

  2. 可能值得明确指定 dtype,例如dtype='str' 或视情况而定。

回答我自己的问题:

虽然我最初担心执行时间,但我发现将文件拆分为 10 个较小的 csv 文件可以更快地提取 headers(总共约 1 秒,而不是一个大文件约 5 秒) 使用 pandas 时。这使得它 on-par 具有 dask 的执行时间来准备其 csv“表示”。然后加载我之后的列的时间实际上比使用此方法的 dask 快,即使使用 low_memory=False 也是如此(<1 秒用于 pandas vs ~3 秒用于 dask)。

这似乎有效地解决了这个问题,尤其是与在 pandas 中加载一个大的 csv 相比(~60 秒变成了~2 秒)。

总结:

  • 将大型 csv 拆分为 10 个较小的 csv 文件
  • 收集列headers
  • 读取列 as-needed,使用 low_memory=False