提问人:Lusian 提问时间:5/17/2023 更新时间:5/17/2023 访问量:53
Dask 中的交叉合并/笛卡尔积
cross merge/cartesian product in dask
问:
如何在 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 个观测值,因此我希望笛卡尔乘积包含大量观测值。
谢谢
答:
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,感谢它有效。因此,这更好的性能也适用于非常大的数据,对吗?
评论