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

如何在Polars的groupby中实现Pandas的min_count参数功能?

Polars 实现 Pandas groupby.sum(min_count=N) 的等价逻辑

需求说明

需要在Polars中实现类似Pandas groupby(key).sum(min_count=N)的效果:按fruit字段分组后,仅保留组内元素数量至少为4的分组,并计算该组price的求和结果。示例输入DataFrame如下:

import polars as pl

df = pl.from_repr("""
┌───────┬───────┐
│ fruit ┆ price │
│ ---   ┆ ---   │
│ str   ┆ i64   │
╞═══════╪═══════╡
│ a     ┆ 1     │
│ a     ┆ 3     │
│ a     ┆ 5     │
│ b     ┆ 10    │
│ b     ┆ 10    │
│ b     ┆ 10    │
│ b     ┆ 20    │
└───────┴───────┘
""")

期望输出仅包含fruit为b的行(该组有4个元素):

┌───────┬───────┐
│ fruit ┆ price │
│ ---   ┆ ---   │
│ str   ┆ i64   │
╞═══════╪═══════╡
│ b     ┆ 50    │
└───────┴───────┘

解决方案

Polars没有直接对应min_count的参数,可通过分组聚合+过滤的两步逻辑实现:

  1. 分组后同时计算目标列的求和值,以及组内元素的计数;
  2. 过滤出计数≥指定阈值的分组;
  3. 移除计数列,得到最终结果。

代码实现

result = (
    df
    .group_by("fruit")
    .agg(
        pl.col("price").sum().alias("price"),
        pl.col("price").count().alias("group_count")
    )
    .filter(pl.col("group_count") >= 4)
    .drop("group_count")
)

print(result)

补充:窗口函数实现方式

也可以先通过窗口函数标记每组的元素数量,再过滤后聚合,适合需要保留原始行信息的场景,但性能略低于先聚合后过滤的方式:

result = (
    df
    .with_columns(pl.col("fruit").count().over("fruit").alias("group_count"))
    .filter(pl.col("group_count") >= 4)
    .group_by("fruit")
    .agg(pl.col("price").sum().alias("price"))
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:43:39