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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:35:16