Dask将2个数据帧连接为1个单个数据帧

时间:2020-10-27 03:34:20

标签: python pandas dask

客观

要将具有部分标记点的df_labelled文件合并到df,其中包含所有点。

我尝试过的事情

参考Simple way to Dask concatenate (horizontal, axis=1, columns),我尝试了下面的代码

df = df.repartition(npartitions=200)
df = df.reset_index(drop=True)
df_labelled = df_labelled.repartition(npartitions=200)
df_labelled = df_labelled.reset_index(drop=True)

df = df.assign(label = df_labelled.label)
df.head()

但随后我收到错误消息

ValueError: Not all divisions are known, can't align partitions. Please use `set_index` to set the index.

我尝试过的另一件事是对表进行左连接,但是所有标签我都得到了NaN,你能解释我做错了什么吗?

result = dd.merge(df, df_labelled, on=['x', 'y', 'z','R', 'G', 'B'], how="left")
result.head()

    x               y               z           R   G   B   label
0   39020.470000    33884.200003    36.445701   25  39  26  NaN
1   39132.740002    33896.049994    30.405700   19  24  18  NaN
2   39221.059994    33787.050001    26.605700   115 145 145 NaN

无论如何,我可以将以下预期结果存档吗?我不能在Pandas中跑步,因为有很多要点会在Pandas中引起内存问题。

数据

df(此文件​​包含所有要点)

    x               y               z           R   G   B
0   39047.700012    33861.890015    48.115704   7   18  12  
1   39044.110016    33860.150024    47.135700   14  28  15
2   39049.280029    33861.950073    49.405701   30  58  33
3   39029.030000    33937.689993    48.425700   152 154 143
4   39066.980000    33937.870001    49.725699   209 218 225
5   39069.810002    33795.460001    42.405699   113 136 154

df_labelled(此文件包含一部分标记点)

    x               y               z           R   G   B   label
0   39047.700012    33861.890015    48.115704   7   18  12  14
1   39044.110016    33860.150024    47.135700   14  28  15  14
2   39049.280029    33861.950073    49.405701   30  58  33  14

预期结果

    x               y               z           R   G   B   label
0   39047.700012    33861.890015    48.115704   7   18  12  14
1   39044.110016    33860.150024    47.135700   14  28  15  14
2   39049.280029    33861.950073    49.405701   30  58  33  14
3   39029.030000    33937.689993    48.425700   152 154 143 nan
4   39066.980000    33937.870001    49.725699   209 218 225 nan
5   39069.810002    33795.460001    42.405699   113 136 154 nan

1 个答案:

答案 0 :(得分:0)

我认为当您执行此类操作时会出错:

df = df.assign(label = df_labelled.label)

因为在数据框df或/和df_labelled中没有索引。而且Dask不支持像熊猫一样的多重索引。 如果您有多个键可以合并Dask中的数据框,请定义左键和右键,而不要使用索引。这个适合我:

result = dd.merge(df, df_labelled, left_on=['x', 'y', 'z','R', 'G', 'B'], right_on = ['x', 'y', 'z','R', 'G', 'B'],  suffixes=['_1', '_2'], how="left")