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

dle*_*eal 8 python pandas dask

按照这里的示例:https://www.youtube.com/watch?v = jrc3cpf3PKU我尝试将~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()
Run Code Online (Sandbox Code Playgroud)

我使用的是具有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
Run Code Online (Sandbox Code Playgroud)

更新2

我在Windows计算机上更新了最新版本的Dask,效果很好.

小智 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]


Run Code Online (Sandbox Code Playgroud)