为了账号安全,请及时绑定邮箱和手机立即绑定

Dask和字段名称中的多重合并

Dask和字段名称中的多重合并

红糖糍粑 2021-11-09 20:38:45
我正在尝试将多个 Pandas 数据帧合并到一个带有字段 ["a_id", "b_id", "c_id"] 的大型 Dask 数据帧上。每个 Pandas 数据帧“A”、“B”和“C”都有一个唯一的字段(“a_id”、“b_id”和“c_id”)将其连接到 Dask 数据帧。“B”和“C”也有一个字段“b_Field1”:import pandas as pdimport dask.dataframe as ddA = pd.DataFrame({'a_id': [1, 2, 3], 'a_Field1': [0, 0, 0]})B = pd.DataFrame({'b_id': [3, 4, 5], 'b_Field1': [7, 8, 9]})C = pd.DataFrame({'c_id': [4, 5, 6], 'b_Field1': [6, 7, 8], 'c_Field1': [10, 11, 12]})pdf = pd.DataFrame({'a_id': [1, 2], 'b_id': [3, 4], 'c_id': [5, 6]})pdf = pdf.merge(A, how="left", on="a_id")pdf = pdf.merge(B, how="left", on="b_id")pdf = pdf.merge(C, how="left", on=["c_id", "b_Field1"])print(pdf)"""Result:   a_id  b_id  c_id  a_Field1  b_Field1  c_Field10     1     3     5         0         7        111     2     4     6         0         8        12"""dA = dd.from_pandas(A, npartitions=1)dB = dd.from_pandas(B, npartitions=1)dC = dd.from_pandas(C, npartitions=1)ddf = dd.from_pandas(pdf, npartitions=1)ddf = ddf.merge(dA, how="left", on="a_id")ddf = ddf.merge(dB, how="left", on="b_id")ddf = ddf.merge(dC, how="left", on=["c_id", "b_Field1"])这失败了,说 ddf 中没有字段“b_Field1”。我的想法是我需要在合并 B 和 C 之间执行 .compute() 命令,但这会导致 Dask 在进度条上无休止地挂起 40%(最终因 MemoryError 而死)。在进行第二次连接之前是否需要计算?如果是这样,它有什么理由挂起?这些数据集刚好小到可以合并到纯 Pandas 中,并且合并发生得很快,但我正在尝试将其部署在 RAM 较少的机器上。
查看完整描述

1 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

如果你在最后一行之前检查数据框,你会发现它有列:

a_id  b_id  c_id  a_Field1_x  b_Field1_x  c_Field1  a_Field1_y  b_Field1_y

即,b_Field1已经一分为二,事实证明两者是相同的。这可能是 Dask 中的一个错误,因为正如您所展示的,Pandas 中不会发生同样的情况。但是,设置适当的索引或调整可选参数merge可能是一种解决方法。

使用数据框,你可以做

ddf = ddf.merge(dC.rename(columns={'b_Field1': 'b_Field1_x'}), 
     how="left", on=["c_id", "b_Field1_x"])

现在你也会得到重复的c_列。

关于一般内存问题,这在别处有很长的讨论。请务必仔细选择您的分区大小、索引和工作人员数量。


查看完整回答
反对 回复 2021-11-09
  • 1 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信