我正在尝试将 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 提交以解决上面列出的功能请求。
中位数与第 50 个百分位数
请注意,对于大多数实际目的,在处理大型数据集时,第 50 个百分位数和中位数是等效的:https ://math.stackexchange.com/questions/2048470/is-50th-percentile-equal-to-median