将大型 Dask 数据框与小型 Pandas 数据框合并

Posted

技术标签:

【中文标题】将大型 Dask 数据框与小型 Pandas 数据框合并【英文标题】:Merge a large Dask dataframe with a small Pandas dataframe 【发布时间】:2017-01-21 01:45:01 【问题描述】:

按照此处的示例:YouTube: Dask-Pandas Dataframe Join 我尝试将 ~70GB Dask 数据帧与我作为 Pandas 数据帧加载的 ~24MB 合并。

合并在 A 和 B 两列上,我没有设置任何索引:

import dask.dataframe as dd
from dask.diagnostics import ProgressBar

small_df = pd.read_csv(dataframe1) # as pandas
large_df = dd.read_csv(dataframe2) #as dask.dataframe

df2 = large_df.merge(small_df, how='left', left_on=leftcolumns, right_on=rightcolumns) #do the merge

A = df2[df2['some column'] == 'somevalue'] #do a reduction that would fit on my computer

pbar = ProgressBar()
pbar.register()

result = A.compute()

我使用的是具有 16GB RAM 和 4 核的 Windows 计算机。 我使用进度条来评估合并过程的进度。我昨晚整晚都离开了它。我今天早上重新启动它,到目前为止大约半小时,进度为 0%。

谢谢你,感谢你的帮助,

更新

我在配备 8GB RAM 的 Mac 上进行了尝试,效果非常好。我相信我有 Anaconda 附带的 Dask 发行版。无论如何,我认为我没有做任何不同的事情。

我按照上述编码(21 分钟)分享我的结果和时间:

In [26]: C = result1.compute()
[########################################] | 100% Completed | 21min 13.4s
[########################################] | 100% Completed | 21min 13.5s
[########################################] | 100% Completed | 21min 13.6s
[########################################] | 100% Completed | 21min 13.6s

更新 2

我在我的 Windows 计算机上更新到最新版本的 Dask,它运行良好。

【问题讨论】:

只是一个旁注,在布尔索引中使用df 而不是df2 是错误的吗? A = df2[df['some column'] == 'somevalue'] 哦,抱歉,我才看到你的意思。是的,这是一个错误。我修好了它。谢谢! @dleal,既然这个问题已经解决,您能否提供解决方案作为答案并接受它(即使这是您自己的问题,也鼓励),将其从未回答的列表中删除?谢谢! 要添加到@Garrett 的评论:请具体说明您拥有的 Dask 版本以及您刚刚更新到什么。 您也可以使用 joblib,并在多个内核上运行该进程。一般的想法是将大型数据集拆分为一组较小的数据集(即[large_df_part1, ... , large_df_partN],然后使用 joblib 将它们分配给不同的处理器。 【参考方案1】:

您可以迭代唯一的相等值并使用循环分配其他列:

unioun_set = list(set(small_df['common_column']) & set(large_df['common_column']))
for el in union_set:
    for column in small_df.columns:
        if column not in large_df.columns:
            large_df.loc[large_df['common_column'] == el,column] = small_df.loc[small_df['common_column'] ==  el,column]


【讨论】:

【参考方案2】:

在处理大数据时,对数据进行分区非常重要,同时必须拥有足够的集群和内存大小。

您可以尝试使用spark

DASK 是一个纯 Python 框架,它做更多相同的事情,即它允许人们在本地或集群上运行相同的 Pandas 或 NumPy 代码。然而,Apache Spark 带来了一个涉及新 API 和执行模型的学习曲线,尽管使用了 Python 包装器。

您可以尝试对数据进行分区并将其存储到parquet 文件中。

【讨论】:

以上是关于将大型 Dask 数据框与小型 Pandas 数据框合并的主要内容,如果未能解决你的问题,请参考以下文章

pandas读取csv相对路径_你还在用Pandas处理大型数据?我发现了一个既省时又省事的工具:Dask!...

Python 中处理大型数据工具(dask)

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

将 Pandas 数据帧转换为 Dask 数据帧

Pandas 将数据框与共享列合并,左右填充

pandas 将数据框与 NaN(或“未知”)合并以查找缺失值