首页 > 解决方案 > 简单的 Dask 频率计数

问题描述

我想做一个频率计数。想象一下这张人和他们的年龄的名单:

    IN [110]: b = db.from_sequence([('alex', 31), ('cassee', 31), ('Wes', 25), ('Allison', 35)])

    In [111]: b.map(lambda x: (x[1], 1))\
             .foldby(lambda x: x[0], lambda total,x: total[1]+x[1]).compute()
    Out[111]: [(31, 2), (25, (25, 1)), (35, (35, 1))]

第一个元组看起来不错(31, 2),意味着出现了 2 次年龄 31。但是,接下来的两个元组的格式很奇怪。我希望输出是频率计数:[(31, 2), (25, 1), (35, 1)]

标签: dask

解决方案


您想要的调用如下:

b.pluck(1).frequencies().compute()

pluck从每个元素中选择“年龄”的工作。frequencies顾名思义:)

你也可以通过其他方式做到这一点:

b.foldby(1, lambda x, y: x + 1, 0).compute()

意思是,使用元素 1 进行分组,并在每个组内将每个元素的值加 1,从 0 开始;

from operator import add
from collections import Counter
b.fold(lambda x, y: x + Counter([y[1]]), add, initial=Counter()).compute()

这解释起来相当复杂......


推荐阅读