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

时间:2016-09-13 12:38:17

标签: python pandas dask

按照这里的示例:https://www.youtube.com/watch?v=jrc3cpf3PKU我尝试将~70GB的Dask数据帧与作为Pandas数据帧加载的~24MB合并。

合并在两列A和B上,我没有将any设置为索引:

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%的进展。

谢谢,感谢您的帮助,

更新

我在Mac上用8GB内存试过它,效果很好。我相信,我有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,效果很好。

2 个答案:

答案 0 :(得分: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]


答案 1 :(得分:0)

在处理大数据时,对数据进行分区非常重要,同时必须具有足够的群集,并且内存大小是强制性的。

您可以尝试使用spark

DASK是一个纯Python框架,可以完成更多相同的工作,即它允许在本地或集群上运行相同的Pandas或NumPy代码。尽管使用Apache包装器,Apache Spark带来了一条学习曲线,其中涉及新的API和执行模型。

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