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
相关产品推荐
相关产品推荐

