命名 Dask 数据框中返回的聚合列

Posted

技术标签:

【中文标题】命名 Dask 数据框中返回的聚合列【英文标题】:Naming returned aggregate columns in Dask dataframes 【发布时间】:2021-12-29 12:45:07 【问题描述】:

当使用 Pandas v0.25 及更高版本时,我可以生成具有自定义名称 using an elegant native syntax 的聚合列:

import pandas as pd

data = "x": [1, 1, 2], "y": [-1, 0, 0]
pd_df = pd.DataFrame(data)

this_is_valid = pd_df.groupby("x").agg(my_custom_name=("y", "mean"))

但是,当我尝试使用 Dask 数据框执行相同操作时,我收到“意外关键字参数”错误。

import dask.dataframe as dd
dask_df = dd.from_pandas(pd_df, npartitions=1)
blows_up = dask_df.groupby("x").agg(my_custom_name=("y", "mean"))

是否有一种直接的方法可以使用 Dask 来完成此任务(并且无需借助 rename 函数),还是不支持此功能?如果不是,是否有根本原因无法支持?

【问题讨论】:

你的熊猫版本是什么? 【参考方案1】:

Dask 有docs on performing custom aggregations。他们讨论了计算均值的情况,以及它比 pandas 对应物更复杂的原因:

许多缩减只能通过多个临时对象来实现。为了实现这些缩减,这些步骤应该返回元组并期望多个参数。平均函数可以实现为:

custom_mean = dd.Aggregation(
    'custom_mean',
    lambda s: (s.count(), s.sum()),
    lambda count, sum: (count.sum(), sum.sum()),
    lambda count, sum: sum / count,
)
df.groupby('g').agg(custom_mean)

这暗示了处理所有类型的用户定义聚合所涉及的复杂性,但很好地概述了如何实现它们。

至于重命名列,我看不出有一种方法可以一步完成(目前)。这可能是错误的,我相信这可能会在未来发生变化。 dask 中复杂的 reshape 操作与其对应的 pandas 显着不同,因为它们需要处理数据分区并考虑各种数据位置,因此复制完整的 pandas API 并非易事。平衡笔记本电脑、分布式集群和高性能计算设施(dask 部署的范围非常广泛)与用户的许多功能请求的性能考虑是 dask 开发人员面临的真正挑战。

一般来说,开源项目的“为什么不存在”的答案是“如果你想贡献它,欢迎 PRs!”。 See dask's development guidelines 提供了一个很好的贡献介绍。

【讨论】:

以上是关于命名 Dask 数据框中返回的聚合列的主要内容,如果未能解决你的问题,请参考以下文章

在具有非唯一索引列日期的 Dask 数据框中提取最新值

对数据框中的一列求和并将结果返回为 int

Dask 到展平字典列

Dask + Pandas:返回一系列条件假人

进行聚合时如何忽略数据框中的特定列

从 HBASE 数据返回聚合