如何在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
相关产品推荐
相关产品推荐

