Polars分组聚合过滤后未返回Null的原因咨询
Polars分组聚合过滤条件结果解析
原始数据与聚合代码
初始DataFrame
import polars as pl df = pl.from_repr(""" ┌───────────┬─────┬─────┐ │ group_col ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═══════════╪═════╪═════╡ │ g1 ┆ 1 ┆ 4 │ │ g1 ┆ 2 ┆ 5 │ │ g2 ┆ 3 ┆ 6 │ └───────────┴─────┴─────┘ """)
分组聚合代码
df.group_by("group_col").agg( pl.col("c").filter((pl.col("b") >= 1) & (pl.col('b').max() == pl.col('b'))).max().alias("gte") )
执行结果
shape: (2, 2) ┌───────────┬─────┐ │ group_col ┆ gte │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═══════════╪═════╡ │ g1 ┆ 5 │ │ g2 ┆ 6 │ └───────────┴─────┘
问题:为何g1组的gte列值不为Null?
解答
核心原因是Polars在分组聚合的filter上下文里,pl.col('b').max()计算的是当前分组内b列的最大值,而非全局最大值:
- 对g1组来说,b列的取值是[1,2],组内最大值为2。
- 过滤条件
(pl.col('b').max() == pl.col('b'))会匹配g1组中b=2的行,对应的c值是5。 - 后续的
.max()从过滤后的c值集合(仅包含5)中取最大值,结果就是5,因此不会返回Null。
另外,pl.col("b") >=1对g1组的两行都成立,但和后一个条件结合后,最终仅保留b=2的行,所以聚合后能得到有效数值。
内容的提问来源于stack exchange,提问作者wedrano de carvalho
相关产品推荐
相关产品推荐

