Dask 中的交叉合并/笛卡尔积

cross merge/cartesian product in dask

提问人:Lusian 提问时间:5/17/2023 更新时间:5/17/2023 访问量:53

问:

如何在 dask 中执行与此交叉合并等效的操作?

merged_df = pd.merge(df, df, how='cross', suffixes=('', '_y'))

举个例子,假设我有这个数据帧,比如说数据帧 A:

#Niusup Niucust
#1        a
#1        b 
#1        c
#2        d
#2        e

并想获得这个:

#Niusup Niucust_x Niucust_y
#1        a       a
#1        a       b
#1        a       c
#1        b       a 
#1        b       b
#1        b       c
#1        c       a 
#1        c       b
#1        c       c
#2        d       d 
#2        d       e
#2        e       d
#2        e       e

我需要 Dask,因为数据帧 A 包含 5000000 个观测值,因此我希望笛卡尔乘积包含大量观测值。

谢谢

python 熊猫 合并 dask 笛卡尔-产品

评论


答:

1赞 Panda Kim 5/17/2023 #1

data = {'#Niusup': {0: '#1', 1: '#1', 2: '#1', 3: '#2', 4: '#2'},
 'Niucust': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}}
df = pd.DataFrame(data)

法典

g = df.groupby('#Niusup')
dfs = [g.get_group(x) for x in g.groups]
pd.concat([df_i.merge(df_i.drop('#Niusup', axis=1), how='cross',suffixes=('', '_y')) for df_i in dfs])

输出:

    #Niusup Niucust Niucust_y
0   #1      a       a
1   #1      a       b
2   #1      a       c
3   #1      b       a
4   #1      b       b
5   #1      b       c
6   #1      c       a
7   #1      c       b
8   #1      c       c
0   #2      d       d
1   #2      d       e
2   #2      e       d
3   #2      e       e

评论

0赞 Lusian 5/17/2023
这实际上给了我一个关键错误:KeyError:1002000415
0赞 Panda Kim 5/17/2023
@Lusian 示例代码是不是有问题?我通过将您的示例转换为代码来更新答案。
0赞 Lusian 5/17/2023
也许我之前将列转换为类别。我会再检查一次
1赞 Panda Kim 5/17/2023
@Lusian 我稍微修改了类似的代码。
0赞 Lusian 5/18/2023
#Panda Kim,感谢它有效。因此,这更好的性能也适用于非常大的数据,对吗?