You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polars分组聚合中获取各组前X%行并计算均值?

在Polars中实现每组前10%数据的聚合

当然可以实现,以下两种常见方式能满足需求:

方法一:聚合阶段直接计算并截取前10%

利用pl.count()获取每组的总行数,算出前10%的数量后,通过head()截取对应行再计算均值:

import polars as pl

ans = df.groupby("groupId").agg(
    pl.col('myValue')
    .sort_by(pl.col('order'))  # 按order列对组内数据排序
    .head(pl.int(pl.count() * 0.1))  # 取每组前10%(数量向下取整)
    .mean()
    .alias('mean_of_top_decile')
)

如果需要对小数数量向上取整,把pl.int()替换为pl.ceil(pl.count() * 0.1).cast(pl.Int64)即可。

方法二:先标记组内排名再筛选聚合

通过窗口函数标记每行在组内的排名和组大小,筛选出前10%的行后再做聚合:

ans = (df
       .sort("groupId", "order")
       .with_columns(
           pl.int_range(0, pl.count()).over("groupId").alias("group_rank"),
           pl.count().over("groupId").alias("group_size")
       )
       .filter(pl.col("group_rank") < pl.col("group_size") * 0.1)
       .groupby("groupId")
       .agg(pl.col("myValue").mean().alias("mean_of_top_decile"))
)

内容的提问来源于stack exchange,提问作者MYK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:25:01