讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

使用 Polars 高效加载多文件并添加自定义元数据列的教程

小丽同学_1052

小丽同学_1052

发布时间:2025-09-27 11:24:01

|

974人浏览过

|

来源于php中文网

原创

使用 Polars 高效加载多文件并添加自定义元数据列的教程

本教程详细介绍了如何利用 Polars 的惰性计算(LazyFrame)功能,高效地加载多个结构相似的 CSV 文件,并在合并数据时为每个文件动态添加一个包含其来源信息(如产品代码)的自定义列。通过结合 scan_csv、with_columns 和 concat 操作,您可以实现并行处理和优化的内存使用,从而有效处理大规模数据集,并灵活地从文件名中提取所需元数据。

引言:多文件加载与自定义处理的挑战

在数据分析领域,我们经常需要处理存储在多个文件中的数据集,例如按产品、日期或区域划分的 csv 文件。一个常见的需求是在合并这些文件时,为每行数据添加一个标识其来源的列(例如,哪个产品的数据)。虽然 polars 提供了 pl.read_csv("data_*.csv") 这样的便捷方法来批量读取文件,但它默认不会在结果 dataframe 中包含文件名信息。如果我们需要为每个文件添加一个基于文件名的自定义列(如 product_code),传统的做法可能是逐一读取、添加列、然后合并,但这可能无法充分利用 polars 的性能优势,尤其是在处理大量文件或大型文件时。

本教程将展示如何利用 Polars 的惰性计算(LazyFrame)机制,以一种高效且内存友好的方式解决这一问题,实现并行文件处理并动态添加自定义元数据。

利用 Polars LazyFrame 实现高效加载与自定义处理

Polars 的 scan_csv 函数是解决此问题的关键。它返回一个 LazyFrame,而不是立即加载数据到内存。LazyFrame 允许我们构建一系列数据转换操作,这些操作直到调用 collect() 方法时才会被执行。当处理多个 LazyFrame 并使用 pl.concat 合并它们时,Polars 能够并行地读取和处理这些文件,从而显著提高效率。

核心步骤

  1. 识别目标文件: 使用 pathlib 模块方便地查找符合特定模式的所有 CSV 文件。
  2. 创建 LazyFrame 并添加自定义列: 对于每个找到的文件,使用 pl.scan_csv 创建一个 LazyFrame。然后,利用 with_columns 方法添加一个新列,其值来源于当前文件名。
  3. 合并 LazyFrame 并收集结果: 将所有带有自定义列的 LazyFrame 放入一个列表中,然后使用 pl.concat 将它们合并。最后,调用 collect() 触发计算并获取最终的 DataFrame。

示例代码

假设我们有以下结构的 CSV 文件:

  • data_product_1.csv
  • data_product_2.csv
  • data_product_3.csv

每个文件内容类似: data_product_1.csv:

data,value
2000-01-01,1
2000-01-02,2

我们的目标是得到一个合并后的 DataFrame,其中包含一个名为 product_code 的新列,显示例如 product_1 或 product_2。

Csv Brain
Csv Brain

加载CSV文件,使用自然语言(英文)提问。通过Anthropic、OpenAI或本地Ollama实现AI驱动的自然语言查询,无需SQL。

下载

首先,确保你已经安装了 Polars:pip install polars

import polars as pl
from pathlib import Path

# 模拟创建示例 CSV 文件
# 在实际应用中,这些文件应已存在
Path("data_product_1.csv").write_text("data,value\n2000-01-01,1\n2000-01-02,2")
Path("data_product_2.csv").write_text("data,value\n2000-01-01,3\n2000-01-02,4")
Path("data_product_3.csv").write_text("data,value\n2000-01-01,4\n2000-01-02,5")

# 1. 查找所有符合模式的 CSV 文件
# Path().glob("data_*.csv") 将返回一个迭代器,包含当前目录下所有匹配的文件路径
file_paths = Path().glob("data_*.csv")

# 2. 为每个文件创建 LazyFrame 并添加自定义列
# 我们希望 product_code 是 'product_1' 而不是 'data_product_1.csv'
lazy_frames = []
for f_path in file_paths:
    # 从文件名中提取 'product_X' 部分
    # f_path.name 获取文件名,如 'data_product_1.csv'
    # .replace(".csv", "") 移除文件扩展名
    # .replace("data_", "") 移除前缀 'data_'
    product_code = f_path.name.replace(".csv", "").replace("data_", "")

    # 创建 LazyFrame 并添加 product_code 列
    lf = pl.scan_csv(f_path).with_columns(
        pl.lit(product_code).alias("product_code")
    )
    lazy_frames.append(lf)

# 3. 合并 LazyFrame 并收集结果
# pl.concat 默认会对 LazyFrames 进行并行计算
if lazy_frames: # 确保有文件被找到
    df_combined = pl.concat(lazy_frames).collect()
    print(df_combined)
else:
    print("没有找到匹配的 CSV 文件。")

# 清理模拟文件 (可选)
Path("data_product_1.csv").unlink()
Path("data_product_2.csv").unlink()
Path("data_product_3.csv").unlink()

输出结果

执行上述代码后,你将得到一个类似以下结构的 Polars DataFrame:

shape: (6, 3)
┌────────────┬───────┬──────────────┐
│ data       ┆ value ┆ product_code │
│ ---        ┆ ---   ┆ ---          │
│ str        ┆ i64   ┆ str          │
╞════════════╪═══════╪══════════════╡
│ 2000-01-01 ┆ 1     ┆ product_1    │
│ 2000-01-02 ┆ 2     ┆ product_1    │
│ 2000-01-01 ┆ 3     ┆ product_2    │
│ 2000-01-02 ┆ 4     ┆ product_2    │
│ 2000-01-01 ┆ 4     ┆ product_3    │
│ 2000-01-02 ┆ 5     ┆ product_3    │
└────────────┴───────┴──────────────┘

注意事项与最佳实践

  • 惰性求值与并行化: scan_csv 创建 LazyFrame,它只记录操作而不立即执行。pl.concat 在处理 LazyFrame 列表时,能够将每个文件的读取和初步处理并行化,从而显著提升性能。collect() 是触发所有操作执行的最终步骤。
  • 内存管理: 对于非常大的数据集,LazyFrame 机制尤其有用,因为它避免了一次性将所有数据加载到内存中,而是按需处理数据块。
  • 文件名解析: 示例中使用了 replace() 方法从文件名中提取 product_code。如果文件名模式更复杂,可以考虑使用正则表达式 (re 模块) 进行更灵活的字符串解析。
  • 错误处理: 在生产环境中,考虑添加文件不存在或文件损坏时的错误处理机制。
  • Schema 一致性: pl.concat 假定所有输入的 DataFrame(或 LazyFrame)具有兼容的列名和数据类型。如果文件结构不一致,可能会导致错误或意外的结果。
  • Polars 的发展: Polars 社区活跃,未来可能会直接在 pl.read_csv 或 pl.scan_csv 中添加类似 DuckDB filename=true 的参数,以更简洁的方式实现此功能。但在当前版本中,上述 LazyFrame 方法是推荐的高效解决方案。

总结

通过结合 Polars 的 scan_csv、with_columns 和 concat 方法,我们能够优雅且高效地解决多文件加载、自定义处理和合并的需求。这种基于 LazyFrame 的方法不仅提供了强大的并行处理能力,还优化了内存使用,使其成为处理大规模多文件数据集的理想选择。掌握这一模式将极大地提升您使用 Polars 进行数据处理的效率和灵活性。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4976

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

3441

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9602

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

832

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

540

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

693

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

406

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

739

2023.12.06

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JavaScript正则表达式基础与实战
JavaScript正则表达式基础与实战

共11课时 | 1.8万人学习

布尔教育正则表达式视频教程
布尔教育正则表达式视频教程

共14课时 | 5.1万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn