如何在 Polars 方法链中高效实现多列 HTML 标签计数与横向聚合

落晨吖_1831

落晨吖_1831

2026-09-09

331人浏览

原创

如何在 Polars 方法链中高效实现多列 HTML 标签计数与横向聚合

本文介绍如何将针对多个文本列(如 ["text1", "text2", "text3", "text4"])的 HTML 标签检测、分组计数与横向求和,完全内联集成于单条 Polars 方法链中,避免 Python 循环、多次扫描或外部 reduce,显著提升可读性与执行效率。

本文介绍如何将针对多个文本列(如 `["text1", "text2", "text3", "text4"]`)的 html 标签检测、分组计数与横向求和,**完全内联集成于单条 polars 方法链中**,避免 python 循环、多次扫描或外部 `reduce`,显著提升可读性与执行效率。

在 Polars 中处理多列相似聚合任务(如对多个文本字段分别统计 HTML 标签出现次数),关键在于避免显式循环 + 多次 .collect() + 外部合并——这不仅破坏惰性计算优势,还引入冗余 I/O 和内存开销。理想方案是:在单次 group_by().agg() 中批量处理所有目标列,并利用 Polars 原生横向聚合函数完成后续汇总。

✅ 推荐方案:pl.col(fields).str.contains_any(...).sum() + pl.sum_horizontal()

以下代码完整替代原始多步循环逻辑,全程在一条惰性链中完成:

import polars as pl

# 预定义 HTML 标签列表(同问题中)
html_tags = [
    "", "", "", "", "<title>", "</title>", "<meta>", "",
    "<link>", "", "<style>", "</style>", "", "", "<header>", "</header>",
    "<footer>", "</footer>", "<nav>", "</nav>", "<main>", "</main>", "<section>", "</section>",
    "<article>", "</article>", "<aside>", "</aside>", "<h1>", "</h1>", "<h2>", "</h2>",
    "<h3>", "</h3>", "<h4>", "</h4>", "<h5>", "</h5>", "<h6>", "</h6>", "<p>", "</p>",
    "
    ", "
", "
    ", "
", "
  • ", "
  • ", "
    ", "
    ", "", "", "", "", "@@##@@", "", "", "
    ", "", "", "", "", "", "", "", "", "", "", "
    ", "
    ", "", "", "", "", "", "", "<script>", "</script>", "", "", "", "", "", "" ] # 主处理链:支持任意字段列表,零外部循环 def contains_html_batch(parquet_file: str, fields: list[str]) -> pl.DataFrame: return ( pl.scan_parquet(parquet_file) .select("publisher", "date", *fields) # 仅加载必要列 .drop_nulls(subset=["publisher", "date"]) # 提前过滤空 key .group_by("publisher", "date") .agg( # 对 fields 中每一列:检测任意 HTML 标签 → 转布尔 → 求和(即计数) pl.col(fields).str.contains_any(html_tags).sum() ) .with_columns( # 新增 sum 列:横向求和,自动跳过 null(等价于 fill_null(0).sum()) sum=pl.sum_horizontal(fields) ) .filter(pl.col("sum") > 0) # 只保留至少含一个标签的组合 .sort("sum", descending=True) .collect() ) # 使用示例 result = contains_html_batch("/tmp/test.parquet", ["text1", "text2", "text3", "text4"])

    ✅ 输出结构说明

    结果 DataFrame 包含:

    • publisher, date:分组键;
    • text1, text2, text3, text4:各列独立的 HTML 标签计数(u32 类型,null 表示该列全为 null 或无匹配);
    • sum:横向求和列(pl.sum_horizontal 自动将 null 视为 0,无需手动 fill_null(0))。

    ? 关键优势:

    anything-to-html
    anything-to-html

    将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。

    下载
    • 单次扫描:.scan_parquet() 仅执行一次;
    • 向量化聚合:pl.col(fields) 批量应用 str.contains_any().sum(),底层高度优化;
    • 零 Python 循环:全部逻辑由 Polars 查询引擎调度;
    • null 安全:pl.sum_horizontal() 默认忽略 null,行为等价于 pl.sum_horizontal(pl.col(fields).fill_null(0)),更简洁。

    ? 替代方案:按字段展开(宽表 → 长表)

    若需分析「哪个字段贡献最多」,而非总和,可用 unpivot() 将结果转为长格式:

    result_long = (
        pl.scan_parquet(parquet_file)
        .select("publisher", "date", *fields)
        .drop_nulls(subset=["publisher", "date"])
        .group_by("publisher", "date")
        .agg(pl.col(fields).str.contains_any(html_tags).sum())
        .unpivot(
            index=["publisher", "date"],
            on=fields,
            variable_name="field_name",
            value_name="tag_count"
        )
        .filter(pl.col("tag_count") > 0)
        .sort(["publisher", "date", "tag_count"], descending=[False, False, True])
        .collect()
    )

    此输出每行代表 (publisher, date, 字段名, 计数),便于后续按字段名分组统计或可视化。

    ⚠️ 注意事项与最佳实践

    • 字段存在性检查:生产环境建议在 select() 前验证 fields 中所有列均存在于 Parquet schema,可加 assert set(fields).issubset(set(df.columns));
    • 性能提示:str.contains_any() 在 Polars ≥ 0.20.30 中已深度优化,但若 html_tags 极大(>1000 项),可考虑预编译正则(pl.col().str.contains(r"", literal=False))或分批处理;
    • 内存友好:始终优先使用 .scan_parquet() + .collect() 而非 .read_parquet(),尤其在大数据集上;
    • 类型安全:pl.sum_horizontal() 要求所有输入列为数值型;若某列含非数值数据,需先 .cast(pl.UInt32, strict=False) 并处理 null。

    通过上述方法,你不仅能将“map-reduce”式逻辑无缝嵌入 Polars 链式调用,还能获得媲美手写 Rust 的执行效率与远超 Pandas 的可维护性。

    前端入门到VUE实战笔记:立即使用
    在学习笔记中,你将探索 前端 的入门与实战技巧!

    相关文章

    HTML速学教程(入门课程)
    HTML速学教程(入门课程)

    HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

    下载

    相关标签:

    html

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    python打包成可执行文件
    python打包成可执行文件

    本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

    2023.07.20

    1751

    4

    python能做什么
    python能做什么

    python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

    2023.07.25

    4524

    7

    format在python中的用法
    format在python中的用法

    Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

    2023.07.31

    1729

    3

    python教程
    python教程

    Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

    2023.08.03

    26617

    23

    python环境变量的配置
    python环境变量的配置

    Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

    2023.08.04

    3227

    5

    python eval
    python eval

    eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

    2023.08.04

    3247

    5

    scratch和python区别
    scratch和python区别

    scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

    2023.08.11

    1183

    5

    python合并两个列表
    python合并两个列表

    Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

    2023.08.10

    596

    4

    python是前端还是后端
    python是前端还是后端

    Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

    2023.08.11

    2523

    5

    热门下载

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

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    GDB 17.2 官方文档集合
    GDB 17.2 官方文档集合

    共0课时 | 0人学习

    Bootstrap 入门安装配置
    Bootstrap 入门安装配置

    共0课时 | 0人学习

    38+ PhpStorm 提示和技巧
    38+ PhpStorm 提示和技巧

    共1课时 | 224人学习