我正在尝试将 dask 数据帧聚合为一组指标,包括中位数,但看起来不支持该中位数。有机会聚合并获得中位数吗?
st_agg = df.groupby(['start station id', 'end station id']).agg({'usertype':'count', 'tripduration':'median'})
>>> ValueError: unknown aggregate median
最佳答案
截至 2021 年 10 月 6 日,Dask 尚未实现此功能。有一个开放的功能请求 here .
特定情况的解决方法
针对同一个问题,下面的代码适用于特定用例,其中每个分组列的数据恰好适合 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)
通用解决方案
对于较大的数据集,您可以构建一个自定义聚合函数,使用“dd.groupby.Aggregation”计算中位数(或第 50 个百分位数)。如果您这样做,请考虑将其作为 PR 提交以解决上面列出的功能请求。
中位数与第 50 个百分位
请注意,对于大多数实际用途,在处理大型数据集时,第 50 个百分位数和中位数是等效的: https://math.stackexchange.com/questions/2048470/is-50th-percentile-equal-to-median
关于python - Dask DataFrame 聚合至中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43812272/