如何在Polars中对分组后的数据进行过滤?
Polars分组筛选组内符合均值条件的数值
你当前的代码仅生成了每个组内C列数值是否大于等于组均值的布尔列表,并未筛选出符合条件的原始数值。要实现目标,可以用以下两种简洁方法:
方法一:窗口函数计算均值后筛选聚合
import polars as pl df = pl.DataFrame({ 'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two'], 'C' : [1, 5, 5, 2, 5, 7], 'D' : [2.0, 5., 8., 1., 2., 9.] }) result = df.with_columns( # 按A分组计算C列均值,添加为新列 pl.col("C").mean().over("A").alias("C_mean") ).filter( # 筛选C列大于等于组均值的行 pl.col("C") >= pl.col("C_mean") ).group_by("A").agg( # 聚合符合条件的C列数值 pl.col("C") ) print(result)
方法二:聚合时直接筛选(更简洁)
result = df.group_by("A").agg( # 在聚合上下文里,直接筛选C列中大于等于组内均值的数值 pl.col("C").filter(pl.col("C") >= pl.col("C").mean()) ) print(result)
两种方法都会得到你期望的结果:
shape: (2, 2) ┌─────┬───────────┐ │ A ┆ C │ │ --- ┆ --- │ │ str ┆ list[i64] │ ╞═════╪═══════════╡ │ foo ┆ [5, 5] │ │ bar ┆ [5, 7] │ └─────┴───────────┘
内容的提问来源于stack exchange,提问作者Claudio
相关产品推荐
相关产品推荐

