Polars中如何按组筛选匹配项并提取最高分对应值

来源:网络编程作者:天穹小白头衔:草根站长
导读:本期聚焦于小伙伴创作的《Polars中如何按组筛选匹配项并提取最高分对应值》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Polars中如何按组筛选匹配项并提取最高分对应值》有用,将其分享出去将是对创作者最好的鼓励。

Polars是一款基于Rust开发的高性能Python数据处理库,在处理大规模结构化数据时性能表现优异。很多数据分析场景中,我们需要先按某个字段分组,再在组内筛选符合特定条件的记录,最后提取每组中分数最高的一条对应的目标值,这类需求用Polars可以高效实现。

基础数据准备

首先我们需要构造示例数据,模拟常见的业务场景数据,包含分组字段、匹配条件字段、分数字段和目标值字段。以下是构造示例数据的代码:

import polars as pl

# 构造示例数据
data = {
    "group_id": ["A", "A", "A", "B", "B", "B", "C", "C"],
    "match_flag": [1, 0, 1, 1, 1, 0, 0, 1],
    "score": [85, 90, 78, 92, 88, 76, 89, 95],
    "target_value": ["val_a1", "val_a2", "val_a3", "val_b1", "val_b2", "val_b3", "val_c1", "val_c2"]
}
df = pl.DataFrame(data)
print("原始数据:")
print(df)

按组筛选匹配项并提取最高分对应值

方法一:使用group_by结合filter和max

首先按group_id分组,然后在每个组内筛选match_flag为1的记录,再找到这些记录中score最高的那条,提取对应的target_value。代码如下:

result = (
    df.group_by("group_id")
    .agg(
        # 筛选组内match_flag为1的记录
        pl.col("target_value").filter(pl.col("match_flag") == 1)
        # 按score降序排序,取第一个值即最高分对应的target_value
        .sort_by(pl.col("score"), descending=True)
        .first()
        .alias("max_score_target")
    )
)
print("方法一结果:")
print(result)

方法二:先全局筛选再分组处理

也可以先全局筛选出match_flag为1的记录,再按group_id分组取每个组的最高分对应值,这种方式在匹配项较少时性能更优。代码如下:

# 先筛选匹配项
filtered_df = df.filter(pl.col("match_flag") == 1)
# 按组取最高分对应的目标值
result2 = (
    filtered_df.group_by("group_id")
    .agg(
        pl.col("target_value")
        .sort_by(pl.col("score"), descending=True)
        .first()
        .alias("max_score_target")
    )
)
print("方法二结果:")
print(result2)

结果验证与说明

上述两种方法的输出结果一致,以方法一为例,输出内容如下:

shape: (3, 2)
┌──────────┬──────────────────┐
│ group_id ┆ max_score_target │
│ ---      ┆ ---              │
│ str      ┆ str              │
╞══════════╪══════════════════╡
│ A        ┆ val_a1           │
│ B        ┆ val_b1           │
│ C        ┆ val_c2           │
└──────────┴──────────────────┘

结果说明:

  • 组A中match_flag为1的记录是第一条和第三条,分数分别为85和78,最高分85对应target_value为val_a1
  • 组B中match_flag为1的记录是第一条和第二条,分数分别为92和88,最高分92对应target_value为val_b1
  • 组C中match_flag为1的记录是第二条,分数95对应target_value为val_c2

性能对比与选择建议

两种方法的适用场景不同:

  • 如果大部分分组都有匹配项,方法一的分组后筛选逻辑更直观,代码可读性更高
  • 如果匹配项占比很低,方法二先全局筛选可以减少后续分组处理的数据量,性能更优

当数据量达到百万级以上时,建议通过实际测试选择更适合当前数据特征的方法。如果需要在提取最高分对应值的同时保留其他字段,可以在agg中添加更多字段的提取逻辑,例如同时提取最高分本身:

result3 = (
    df.group_by("group_id")
    .agg(
        pl.col("target_value").filter(pl.col("match_flag") == 1)
        .sort_by(pl.col("score"), descending=True)
        .first()
        .alias("max_score_target"),
        pl.col("score").filter(pl.col("match_flag") == 1)
        .max()
        .alias("max_score")
    )
)
print("带最高分的结果:")
print(result3)

PolarsDataFramegroup_byfiltermax_score修改时间:2026-07-14 13:45:40

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。