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

Polars中GroupBy时保留非分组列的实现方法

Polars分组后保留非分组列的直接实现方法

以下几种方法都能直接实现按['TGT', 'IT']分组取Cd最小值的同时保留SRC列,无需关联去重:

方法1:窗口函数+过滤

先给每个分组计算最小Cd,再过滤出对应行,直接保留所有列:

import polars as pl

# 示例DataFrame
df = pl.DataFrame({
    "TGT": ["A", "A", "B"],
    "IT": ["X", "X", "Y"],
    "Cd": [3, 1, 2],
    "SRC": ["S1", "S2", "S3"]
})

result = df.with_columns(
    pl.col("Cd").min().over(["TGT", "IT"]).alias("min_Cd")
).filter(pl.col("Cd") == pl.col("min_Cd")).drop("min_Cd")

如果同一分组内有多个Cd等于最小值的行,这个方法会保留所有匹配行,适合需要全部结果的场景。

方法2:分组聚合时直接关联取对应SRC

在group_by的agg操作中,直接过滤出当前分组内Cd最小的SRC值:

result = df.group_by(["TGT", "IT"], maintain_order=True).agg(
    pl.col("Cd").min().alias("Cd"),
    pl.col("SRC").filter(pl.col("Cd") == pl.col("Cd").min()).first().alias("SRC")
)

这里用first()取第一个匹配的SRC,如果需要所有匹配值,可换成list()收集。

方法3:排序+去重(最简洁)

先按分组列和Cd升序排序,再保留每个分组的第一行:

result = df.sort(["TGT", "IT", "Cd"]).unique(["TGT", "IT"], keep="first")

这种方式代码最简洁,适合只需要每个分组内Cd最小的那一行的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:12:13