0

0

Polars 中按组筛选匹配项并提取最高分对应值的完整教程

碧海醫心

碧海醫心

发布时间:2026-01-25 10:57:22

|

925人浏览过

|

来源于php中文网

原创

Polars 中按组筛选匹配项并提取最高分对应值的完整教程

本文详解如何在 polars 中对分组数据执行“基于另一列值索引 list 列”的操作,包括精准匹配筛选、跨列索引取值、获取最大得分对应 match 值等核心技巧,并提供可直接运行的代码示例与关键注意事项。

在 Polars 数据处理中,常需对 group_by 后生成的 list 列(如 match: list[str] 和 score: list[i64])进行关联索引提取——例如:在每组 seq 内,找到 seq_grp != match 的记录中 score 最高的那条,并返回其 match 值和 score。这并非简单 .list.get() 可解决,而是需要利用 Polars 的向量化索引能力(如 .get() 配合 .arg_max())实现跨列逻辑对齐。

以下以原始 DataFrame 为例,逐步演示正确实现方式:

import polars as pl

df = pl.DataFrame(
    {
        "seq": "foo bar bar duk duk baz baz baz zed".split(),
        "seq_grp": "aa bb bb dd dd cc cc cc zz".split(),
        "match": "aa cc bb dd dd ff cc cc yy".split(),
        "score": [10, 8, 20, 8, 7, 5, 6, 4, 6],
    }
)

✅ 正确做法:使用 arg_max() + get() 实现安全索引

要获取每组中 seq_grp ≠ match 的最高分记录对应的 match 值和 score,应避免先 group_by().agg() 再手动索引(易出错且低效),而应直接在 lazy 模式下链式操作:

result = (
    df.lazy()
    .filter(pl.col("match") != pl.col("seq_grp"))  # 先过滤不匹配项
    .group_by(["seq", "seq_grp"], maintain_order=True)
    .agg(
        best_non_match=pl.col("match").get(pl.col("score").arg_max()),
        top_score=pl.col("score").max(),
        # 可选:同时获取原始索引位置(调试用)
        argmax_idx=pl.col("score").arg_max(),
    )
    .collect()
)

print(result)

输出:

shape: (3, 5)
┌─────┬─────────┬────────────────┬───────────┬────────────┐
│ seq ┆ seq_grp ┆ best_non_match ┆ top_score ┆ argmax_idx │
│ --- ┆ ---     ┆ ---            ┆ ---       ┆ ---        │
│ str ┆ str     ┆ str            ┆ i64       ┆ u32        │
╞═════╪═════════╪════════════════╪═══════════╪════════════╡
│ bar ┆ bb      ┆ cc             ┆ 8         ┆ 0          │
│ baz ┆ cc      ┆ ff             ┆ 5         ┆ 0          │
│ zed ┆ zz      ┆ yy             ┆ 6         ┆ 0          │
└─────┴─────────┴────────────────┴───────────┴────────────┘
? 关键原理:pl.col("score").arg_max() 返回该组内 score 最大值的相对索引位置(u32),pl.col("match").get(...) 则用该索引从同组 match list 中安全取值——二者天然对齐,无需显式构造 list 列。

⚠️ 常见误区与注意事项

  • ❌ 错误示范(勿模仿)

    刺鸟创客
    刺鸟创客

    一款专业高效稳定的AI内容创作平台

    下载
    # 危险!group_by 后再 list.get(0) 会丢失组内结构,无法支持动态索引
    df.group_by("seq").agg(pl.all()).with_columns(pl.col("match").list.get(0))

    此写法仅适用于固定位置取值,无法实现“按 score 最大值动态取 match”。

  • ✅ 必须使用 .lazy()
    arg_max() 在 eager 模式下对聚合后 list 列行为不稳定;lazy 模式保障计算图优化与语义一致性。

  • ⚠️ 空组处理
    若某组无 match != seq_grp 记录(如 "foo" 组),filter 后该组将被自动丢弃。如需保留空组结果,改用 over + 条件掩码:

    df.with_columns(
        is_non_match=(pl.col("match") != pl.col("seq_grp")),
        score_cond=pl.when(pl.col("is_non_match"), then=pl.col("score")).otherwise(None),
    ).with_columns(
        best_non_match=pl.col("match").get(pl.col("score_cond").arg_max().over("seq")),
        top_score=pl.col("score_cond").max().over("seq"),
    ).filter(pl.col("top_score").is_not_null())
  • ? 扩展技巧:返回整行信息
    若还需其他字段(如原始 seq 行号),可在 filter 后添加 with_row_index():

    df.lazy().with_row_index().filter(...).group_by(...).agg(
        pl.col("match").get(pl.col("score").arg_max()),
        pl.col("index").get(pl.col("score").arg_max()),  # 获取原行号
    )

✅ 总结

Polars 中实现“按条件筛选后取最高分对应值”的最佳实践是:
① 使用 .filter() 预筛选目标子集;
② 用 .group_by(...).agg() 聚合时,直接调用 col.get(arg_max()) 完成跨列索引;
③ 始终优先采用 .lazy().collect() 保证计算稳定性与性能。

该模式高效、安全、可读性强,是 Polars 处理复杂分组索引任务的标准范式。

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

99

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

132

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

15

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号