使用 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()
一些建议:
如果文件适合内存,通常使用普通 pandas
更方便。 dask
的并行处理的好处开始用于大 tasks/files。
可能值得明确指定 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
我正在尝试使用 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()
一些建议:
如果文件适合内存,通常使用普通
pandas
更方便。dask
的并行处理的好处开始用于大 tasks/files。可能值得明确指定
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