如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章
保存 pd.DataFrame 时如何强制 parquet dtypes?
在 for 循环中将 Python Dask 系列转换为列表或 Dask DataFrame
懒惰地从 PostgreSQL / Cassandra 创建 Dask DataFrame