
在数据分析工作中,我们经常需要处理存储在多个文件中的数据,例如按产品、日期或区域划分的 CSV 文件。一个常见的需求是,在将这些文件合并成一个统一的 DataFrame 时,能够为每条记录添加一个标识其来源的列,例如文件名称或从文件名中提取的特定信息(如产品ID)。
考虑以下场景:您有一系列 CSV 文件,命名模式为 data_product_1.csv, data_product_2.csv 等,它们结构相同。您希望将所有数据合并到一个 Polars DataFrame 中,并额外添加一列 product_code,其值应从文件名中提取,例如 product_1、product_2。
直接使用 polars.read_csv("data_*.csv") 可以将所有文件合并,但这种方法不提供在加载过程中添加自定义列的机制。虽然可以逐个文件加载、添加列再合并,但这可能无法充分利用 Polars 的并行处理优势,尤其是在文件数量众多时。
为了高效地解决上述问题,Polars 提供了 scan_csv(或 scan_parquet 等)结合 LazyFrame 的方式,允许我们对每个文件进行预处理,然后并行地收集结果。
首先,我们创建几个示例 CSV 文件,以便后续代码能够运行。
Delphi 7应用编程150例 CHM全书内容下载,全书主要通过150个实例,全面、深入地介绍了用Delphi 7开发应用程序的常用方法和技巧,主要讲解了用Delphi 7进行界面效果处理、图像处理、图形与多媒体开发、系统功能控制、文件处理、网络与数据库开发,以及组件应用等内容。这些实例简单实用、典型性强、功能突出,很多实例使用的技术稍加扩展可以解决同类问题。使用本书最好的方法是通过学习掌握实例中的技术或技巧,然后使用这些技术尝试实现更复杂的功能并应用到更多方面。本书主要针对具有一定Delphi基础知识
0
import polars as pl
from pathlib import Path
# 创建一个临时目录来存放CSV文件
temp_dir = Path("temp_data")
temp_dir.mkdir(exist_ok=True)
# 创建示例CSV文件
data_product_1 = pl.DataFrame({
"data": ["2000-01-01", "2000-01-02"],
"value": [1, 2]
})
data_product_1.write_csv(temp_dir / "data_product_1.csv")
data_product_2 = pl.DataFrame({
"data": ["2000-01-01", "2000-01-02"],
"value": [3, 4]
})
data_product_2.write_csv(temp_dir / "data_product_2.csv")
data_product_3 = pl.DataFrame({
"data": ["2000-01-01", "2000-01-02"],
"value": [5, 6]
})
data_product_3.write_csv(temp_dir / "data_product_3.csv")
print("示例CSV文件已创建在 'temp_data' 目录下。")该方法的核心思想是:
import polars as pl
from pathlib import Path
# 假设文件位于当前目录或指定目录
# 如果文件在 'temp_data' 目录下,则路径应为 Path("temp_data")
data_directory = Path("temp_data")
# 获取所有匹配的文件路径
csv_files = list(data_directory.glob("data_*.csv"))
# 创建 LazyFrame 列表,并为每个 LazyFrame 添加 product_code 列
lazy_frames = []
for f_path in csv_files:
# 提取文件名作为 product_code
# f_path.stem 获取不带扩展名的文件名 (e.g., "data_product_1")
# .replace("data_", "") 进一步提取 "product_1"
product_code = f_path.stem.replace("data_", "")
# 使用 scan_csv 创建 LazyFrame
# 使用 with_columns 添加 product_code 列
lf = pl.scan_csv(f_path).with_columns(
pl.lit(product_code).alias("product_code")
)
lazy_frames.append(lf)
# 使用 pl.concat 合并所有 LazyFrame,然后使用 .collect() 触发计算
# 默认情况下,pl.concat 会并行处理 LazyFrame
if lazy_frames:
final_df = pl.concat(lazy_frames).collect()
print(final_df)
else:
print("未找到匹配的CSV文件。")
# 清理示例数据
import shutil
if temp_dir.exists():
shutil.rmtree(temp_dir)
print("\n示例数据目录 'temp_data' 已删除。")输出示例:
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 ┆ 5 ┆ product_3 │ │ 2000-01-02 ┆ 6 ┆ product_3 │ └────────────┴───────┴──────────────┘
上述 for 循环可以通过列表推导式进一步简化,代码更加紧凑:
import polars as pl
from pathlib import Path
data_directory = Path("temp_data")
# 重新创建示例数据以确保代码可运行
temp_dir = Path("temp_data")
temp_dir.mkdir(exist_ok=True)
data_product_1 = pl.DataFrame({"data": ["2000-01-01", "2000-01-02"], "value": [1, 2]})
data_product_1.write_csv(temp_dir / "data_product_1.csv")
data_product_2 = pl.DataFrame({"data": ["2000-01-01", "2000-01-02"], "value": [3, 4]})
data_product_2.write_csv(temp_dir / "data_product_2.csv")
data_product_3 = pl.DataFrame({"data": ["2000-01-01", "2000-01-02"], "value": [5, 6]})
data_product_3.write_csv(temp_dir / "data_product_3.csv")
lazy_frames = [
pl.scan_csv(f_path).with_columns(
pl.lit(f_path.stem.replace("data_", "")).alias("product_code")
)
for f_path in data_directory.glob("data_*.csv")
]
if lazy_frames:
final_df = pl.concat(lazy_frames).collect()
print(final_df)
else:
print("未找到匹配的CSV文件。")
# 清理示例数据
import shutil
if temp_dir.exists():
shutil.rmtree(temp_dir)通过巧妙地结合 Polars 的 scan_csv、LazyFrame 和 concat 方法,我们能够高效且灵活地处理多文件数据加载场景。这种方法不仅允许在合并前对每个文件进行自定义转换,还充分利用了 Polars 的并行处理能力,从而在处理大规模数据集时提供了卓越的性能和内存效率。掌握这一模式,将极大地提升您在 Polars 中处理复杂数据管道的能力。
以上就是使用 Polars 高效加载多文件并进行自定义处理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号