Dask 字符串连接聚合

Dask String Concat Aggregation

下面是一个pandas操作。我如何在 Dask 中执行此操作?

In [10]: pdf
Out[10]:
  name  text
0    a  asdf
1    b  fdsa
2    a  qwer
3    c  zxcv
4    c  jkl;

In [11]: pdf.groupby('name').aggregate(" ".join)
Out[11]:
           text
name
a     asdf qwer
b          fdsa
c     zxcv jkl;

我想通过连接相应组中的字符串来聚合 text 列。目前 Dask 仅提供数字类型的聚合。我该怎么做?

您可以使用 apply.

而不是 aggregate

运行:

pdf.groupby('name').text.apply(lambda grp: ' '.join(grp),
    meta=('text', 'object')).compute()

如果要按索引对结果进行排序,请在 Pandas 级别进行 (在compute()之后),在上面的代码中添加.sort_index()

另一个基于自定义聚合的解决方案

  1. import itertools as it(下面会用到)

  2. 定义以下自定义聚合:

    collect_concat = dd.Aggregation(name='collect_concat',
        chunk=lambda s1: s1.apply(list),
        agg=lambda   s2: s2.apply(lambda chunks: list(it.chain.from_iterable(chunks))),
        finalize=lambda s3: s3.apply(lambda xx: ' '.join(xx))
    )
    
  3. 计算结果:

    pdf.groupby('name').text.agg(collect_concat).compute()
    

这次结果按name排序。

截至 2020-06-17

的评论中的问题后的解释

dd.Aggregation 是 3 个函数的 "envelope":

  • chunk - 为当前生成 "partial result" 的函数 分组键,在当前分区中。 在这种情况下,一系列 text 值被转换为 list.
  • agg - 连接部分结果的函数(对于当前分组 键),来自所有分区。在这种情况下,所有部分列表都是 连接成一个列表。
  • finalize - 在 agg 之后执行 "postprocessing" 的函数,如果有的话 是需要的。 请注意 agg 的结果是 list,而我们需要一个 string - space 此列表的分隔串联。 这个函数只执行这个任务。

有关更多详细信息和示例,请查看 dask 文档。