Dask DataFrame 聚合到中位数

Phi*_*ats 7 python dask

我正在尝试将 dask 数据框聚合到一组指标,包括中位数,但看起来不支持该中位数。有机会汇总并获得中位数吗?

st_agg = df.groupby(['start station id', 'end station id']).agg({'usertype':'count', 'tripduration':'median'})

>>> ValueError: unknown aggregate median
Run Code Online (Sandbox Code Playgroud)

小智 0

截至 2021 年 10 月 6 日,Dask 尚未实现此功能。这里有一个开放的功能请求。

特定情况的解决方法

对于同一个问题,下面的代码适用于特定用例,其中每个分组列的数据正好适合 1 个分区:

ddf = dask.datasets.timeseries()
ddf = ddf.set_index('id')

median_fun = dd.Aggregation(
    name="median",
    # this computes the median on each partition
    chunk=lambda s: s.median(),
    # this combines results across partitions; the input should just be a list of length 1
    agg=lambda s0: s0.sum(),
)

median_ddf = ddf.groupby("id")["x"].agg(median_fun)
Run Code Online (Sandbox Code Playgroud)

通用解决方案

对于较大的数据集,您可以构建一个自定义聚合函数,使用“dd.groupby.Aggregation”计算中位数(或第 50 个百分位数)。如果您这样做,请考虑将其作为 PR 提交以解决上面列出的功能请求。

请参阅此处的文档:https://docs.dask.org/en/stable/ generated/dask.dataframe.groupby.Aggregation.html#dask-dataframe-groupby-aggregation

中位数与第 50 个百分位数

请注意,对于大多数实际目的,在处理大型数据集时,第 50 个百分位数和中位数是等效的:https ://math.stackexchange.com/questions/2048470/is-50th-percentile-equal-to-median