在dask数据帧上使用groupby

时间:2016-11-29 03:04:44

标签: python pandas dask

关于在dask数据帧上使用groupby,我有几个问题。 据我了解,迭代onby结果就像在Pandas中一样,但在dask中不起作用,即

for name, group in sorted(grouped.groups):
    logger.info((name, group))

是不允许的。我们应该使用apply代替。 但是,在Pandas,如果我想找出组的数量,我可以做以下事情:

 len(grouped.groups)

通过使用apply,我希望能够在dask数据帧上为groupby执行此操作:

 d_grouped.apply(len)

但这不起作用。如何在dask数据帧中找出groupby产生的组数?

1 个答案:

答案 0 :(得分:0)

确定组的数量几乎肯定需要遍历所有数据。因此,我认为这是一个昂贵的计算。如果您必须计算该数字,可以尝试以下方法:

使用drop_duplicates

您可以返回原始数据框(此处:ddf),选择您用于groupby的列(在我的示例[A, B]中或仅A )并计算结果的长度:

pdf = pd.DataFrame(dict(A=[0,0,0,1,1,1,2], B=[0,0,0,1,1,2,2]))
ddf = dd.from_pandas(pdf, npartitions = 2)
len(ddf[['A', 'B']].drop_duplicates()) ## 4 groups
len(ddf['A'].drop_duplicates()) ## 3 groups

虽然这需要加载所有数据,但它不需要随机播放。

lambda x: 1应用于每个组并计算结果的长度

您还可以将一个简单函数应用于groupby对象并计算结果的长度:

len(ddf.groupby('A').apply(lambda x: 1).compute())

由于这可能触发可能导致性能非常低的完全洗牌,我宁愿建议使用第一种方法。