Python Dask-按所有列上的性能分组

Python Dask-按所有列上的性能分组,python,dask,dask-dataframe,Python,Dask,Dask Dataframe,我想计算数据中唯一行的数量。下面是一个快速输入/输出示例 #input A,B 0,0 0,1 1,0 1,0 1,1 1,1 #output A,B,count 0,0,1 0,1,1 1,0,2 1,1,2 我管道中的数据有5000多列和1M多行,每个单元格都是0或1。下面是我两次尝试使用Dask进行缩放(共26列): 结果: 9.491615056991577 12.688117980957031 第一个解决方案首先将每个列连接成一个字符串,然后在其上运行group by。第二个只是

我想计算数据中唯一行的数量。下面是一个快速输入/输出示例

#input
A,B
0,0
0,1
1,0
1,0
1,1
1,1

#output
A,B,count
0,0,1
0,1,1
1,0,2
1,1,2
我管道中的数据有5000多列和1M多行,每个单元格都是0或1。下面是我两次尝试使用Dask进行缩放(共26列):

结果:

9.491615056991577
12.688117980957031
第一个解决方案首先将每个列连接成一个字符串,然后在其上运行group by。第二个只是按所有列分组。我倾向于使用第一个,因为它在我的测试中更快,但我愿意接受建议。如果在性能方面有更好的解决方案,请随意完全更改我的解决方案(另外,有趣的是,sort=False不会加快分组速度,这实际上可能与此有关:和此)

注: 经过一些测试后,第一个解决方案与列数的比例相对较好。我想一个改进可能是散列字符串,使其始终具有固定长度。在这种情况下,对分区号有什么建议吗?从远程仪表板上,我可以看到,经过几次操作后,计算图中的节点减少到只有3个,而没有利用其他可用的worker

第二种解决方案在列数增加时失败

注2: 另外,在第一个解决方案中,我猜Dask如何调度和映射操作发生了一些非常奇怪的事情。发生的情况是,一段时间后,一个工作进程比其他工作进程获得更多的任务,然后该工作进程超过95%的内存,崩溃,然后任务被正确拆分,但一段时间后,另一个工作进程获得更多的任务(并且循环重新启动)。管道运行良好,但我想知道这是否是预期的行为。附上一张截图:

您希望整个数据库中有多少唯一的行?很多,这就是为什么在本例中数据是随机生成的。我预计这些行中至少有三分之一是唯一的(甚至可能有一半)。谢谢@kate Melnykovai如果每列的值都由一个字母或数字解码,那么第一个解决方案对我来说就足够好了。如果没有,我会将其更改为
ddf\u concat=ddf.apply('''.join,axis=1).to\u frame()
。很好!谢谢你,凯特·梅尔尼科娃。对第二条有什么建议吗?对不起,没有主意。
9.491615056991577
12.688117980957031