关于在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产生的组数?
答案 0 :(得分:0)
确定组的数量几乎肯定需要遍历所有数据。因此,我认为这是一个昂贵的计算。如果您必须计算该数字,可以尝试以下方法:
您可以返回原始数据框(此处: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())
由于这可能触发可能导致性能非常低的完全洗牌,我宁愿建议使用第一种方法。