如何将 Dask.DataFrame 转换为 pd.DataFrame?

Posted

技术标签:

【中文标题】如何将 Dask.DataFrame 转换为 pd.DataFrame?【英文标题】:How to transform Dask.DataFrame to pd.DataFrame? 【发布时间】:2016-12-24 19:20:02 【问题描述】:

如何将生成的 dask.DataFrame 转换为 pandas.DataFrame(假设我完成了繁重的工作,只想将 sklearn 应用于我的汇总结果)?

【问题讨论】:

【参考方案1】:

您可以调用 .compute() 方法将 dask.dataframe 转换为 pandas 数据帧:

df = df.compute()

【讨论】:

是否可以将其重命名为更直观的名称,例如to_pandas()? 可能不会,不。 .compute() 在所有 dask 集合中是相当标准的。 .to_compute() 实际上对于任何使用 dask 的人来说都非常直观。 @MRocklin,我正在从一个文件夹中读取所有 csv,我无法明确提及每个列名及其 dtypes。并将所有 df 合并到一个公共列上的单个 df。当我在做 df.compute 时,我得到ValueError: The columns in the computed data do not match the columns in the provided metadata,如何处理这个 @pyd,查看read_csv中的meta,可以通过普通的pandas.read_csv()提供;但您需要确保此类meta 信息在您正在阅读的所有文件中保持一致。【参考方案2】:

MRocklin 的回答是正确的,这个回答提供了更多详细信息,说明何时适合从 Dask DataFrame 转换为 Pandas DataFrame(以及如何预测何时会导致问题)。

Dask DataFrame 中的每个分区都是 Pandas DataFrame。运行 df.compute() 会将 Dask DataFrame 中的所有底层分区合并为一个 Pandas DataFrame。如果 Pandas DataFrame 的大小大于您机器上的 RAM,则会导致问题。

如果df 有 30 GB 的数据,而您的计算机有 16 GB 的 RAM,那么 df.compute() 将因内存错误而崩溃。如果df 只有 1 GB 的数据,那你就没事了。

您可以运行 df.memory_usage(deep=True).sum() 来计算您的 DataFrame 正在使用的内存量。这会让你知道你的 DataFrame 是否足够小,可以合并成一个 Pandas DataFrame。

重新分区会更改 Dask DataFrame 中底层分区的数量。 df.repartition(1).partitions[0] 在概念上类似于 df.compute()

在执行大过滤操作后,转换为 Pandas DataFrame 尤其可能。如果您将 1000 亿行数据集过滤到 10000 行,那么您可能只需切换到 Pandas API。

【讨论】:

【参考方案3】:
pd_df = pd.DataFrame(dsk_df)

给你。它比dsk_df.compute() 更快。

【讨论】:

根据我的经验,这只是返回一个数据框,其中只有列名转置在一行中。

以上是关于如何将 Dask.DataFrame 转换为 pd.DataFrame?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据读取到 dask 数据帧并删除坏行

保存 pd.DataFrame 时如何强制 parquet dtypes?

在 for 循环中将 Python Dask 系列转换为列表或 Dask DataFrame

懒惰地从 PostgreSQL / Cassandra 创建 Dask DataFrame

如何将压缩(gz)CSV文件读入dask Dataframe?

如何从标准输入读取 dask 数据帧?