Dask数据框中的多个聚合用户定义函数

Posted

技术标签:

【中文标题】Dask数据框中的多个聚合用户定义函数【英文标题】:Multiple aggregation user defined functions in Dask dataframe 【发布时间】:2019-02-08 12:15:12 【问题描述】:

我正在使用 Dask 处理数据集(考虑到它不适合内存),我想根据列及其类型使用不同的聚合函数对实例进行分组。

Dask 有一组用于数值数据类型的默认聚合函数,但不适用于字符串/对象。有没有办法为字符串实现用户定义的聚合函数,有点类似于下面的示例?

atts_to_group = 'A', 'B'
agg_fn = 
  'C': 'mean'  #int
  'D': 'concatenate_fn1'  #string - No default fn for strings - Doesn't work
  'E': 'concatenate_fn2'  #string

ddf = ddf.groupby(atts_to_group).agg(agg_fn).compute().reset_index()

此时,我可以在删除不相关的列/行时读取内存中的整个数据集,但我更喜欢在 Dask 中继续处理,因为它可以更快地执行所需的操作。

编辑: 尝试将自定义函数直接添加到字典中:

def custom_concat(df):
    ...
    return df_concatd

agg_fn = 
  'C': 'mean'  #int
  'D': custom_concat(df)


-------------------------------------------------------
ValueError: unknown aggregate Dask DataFrame Structure:

【问题讨论】:

如果 dask 类似于 pandas,您可以引用用户定义的函数。简单地不要用字符串文字来调用它,当然它应该存在,用deflambda 定义,接收一个系列参数并返回一个系列。请显示功能分配。并且 不起作用 没有帮助。发布错误/不想要的结果。 @Parfait 我刚刚意识到有一个服装聚合功能。我在下面的答案中以两种不同的方式实现了解决方案。 【参考方案1】:

Realised Dask 提供Aggregation data structure。自定义聚合可以如下完成:

# Concatenates the strings and separates them using ","
custom_concat = dd.Aggregation('custom_sum', lambda x: ",".join(str(x)), lambda x0: ",".join(str(x0)))
custom_concat_E = ...

atts_to_group = 'A', 'B'
agg_fn = 
  'C': 'mean'  #int
  'D': custom_concat_D
  'E': custom_concat_E

ddf = ddf.groupby(atts_to_group).agg(agg_fn).compute().reset_index()

这也可以使用 Dataframe.apply 来完成,以获得更简洁的解决方案

def agg_fn(x):
    return pd.Series(
        dict(
            C = x['C'].mean(), # int
            D = "%s" % ', '.join(x['D']), # string (concat strings)
            E = ...
        )
    )

ddf = ddf.groupby(atts_to_group).apply(agg_fn).compute().reset_index

【讨论】:

亲爱的@giesOr,在这种返回字典的情况下,您将如何为 dask.apply 函数提供元属性?

以上是关于Dask数据框中的多个聚合用户定义函数的主要内容,如果未能解决你的问题,请参考以下文章

在具有多个因子(字符)变量的数据框中聚合(小计)

如何根据列中的最新日期聚合 pandas 数据框中的行?

r R聚合DataIt使用一个或多个BY变量和一个已定义的函数相对容易地折叠R中的数据.http://www.statmetho

如何通过使用数据框中的其他列来聚合熊猫数据框中的列

pandas编写自定义函数计算多个数据列的加和(sum)使用groupby函数和apply函数聚合计算分组内多个数据列的加和

如何分组并将操作聚合到多个列?