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()
。
另一个基于自定义聚合的解决方案:
import itertools as it
(下面会用到)
定义以下自定义聚合:
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))
)
计算结果:
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 文档。
下面是一个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()
。
另一个基于自定义聚合的解决方案:
import itertools as it
(下面会用到)定义以下自定义聚合:
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)) )
计算结果:
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 文档。