如何在 Dask 中高效地从 DataFrame 到多个 Series?

How to go from DataFrame to multiple Series efficiently in Dask?

我正在尝试找到一种有效的方法将 DataFrame 转换为 Dask 中的一堆持久化 Series(列)。

考虑一个场景,其中数据大小远大于工作内存的总和,并且大多数操作将被 read-from-disk / spill 包装-到磁盘。对于仅对单个列(或成对的列)进行操作的算法,为每个列操作从磁盘读入整个 DataFrame 是低效的。在这种情况下,最好在本地从(可能持久化的)DataFrame 切换到持久化列。天真地实施:

persisted_columns = {}
for column in subset_of_columns_to_persist:
    persisted_columns[column] = df[column].persist()

这可行,但效率很低,因为 df[column] 将从磁盘重新读取整个 DataFrame N = len(subset_of_columns_to_persist) 次。是否可以基于单个 read-from-disk 反序列化操作单独提取和保留多个列?


注意:len(subset_of_columns_to_persist) 是 >> 1,即简单地将 DataFrame 投影到 df[subset_of_columns_to_persist] 不是我正在寻找的解决方案,因为它仍然有一个重要的 I/O持久化单个列的开销。

您可以使用 dask.persist 函数同时保留多个集合。这将共享中间体。

columns = [df[column] for column in df.columns]
persisted_columns = dask.persist(*columns)
d = dict(zip(df.columns, persisted_columns))