
Polars 提供了 pl.concat() 函数,支持直接对多个 LazyFrame 进行惰性垂直拼接(即行方向合并),无需提前调用 .collect() 触发计算,从而避免内存与性能开销。
polars 提供了 `pl.concat()` 函数,支持直接对多个 `lazyframe` 进行惰性垂直拼接(即行方向合并),无需提前调用 `.collect()` 触发计算,从而避免内存与性能开销。
在 Polars 中,LazyFrame 的设计核心是延迟执行——所有操作仅构建查询计划,直到显式调用 .collect() 才真正执行。因此,垂直合并(即按行堆叠)两个 LazyFrame 时,应优先使用支持惰性求值的接口,而非先收集再合并(如 DataFrame.vstack() 或 extend()),后者会破坏懒加载优势,导致不必要的中间数据加载和内存占用。
✅ 正确做法:使用 polars.concat()
该函数原生支持 LazyFrame 列表,自动进行列名对齐与类型兼容性检查(要求 schema 一致或可广播),并返回一个新的 LazyFrame,整个过程完全惰性:
import polars as pl
lf1 = pl.LazyFrame({"a": [1, 2], "b": ["x", "y"]})
lf2 = pl.LazyFrame({"a": [3, 4], "b": ["z", "w"]})
# 惰性拼接:不触发任何计算
combined_lf = pl.concat([lf1, lf2], how="vertical")
# 仅在此处执行实际计算
result_df = combined_lf.collect()
print(result_df)
输出:
shape: (4, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪═════╡ │ 1 ┆ x │ │ 2 ┆ y │ │ 3 ┆ z │ │ 4 ┆ w │ └─────┴─────┘
⚠️ 注意事项:
-
how="vertical"是默认行为(可省略),确保按行堆叠;若需列方向合并,请改用how="horizontal"(需列名无冲突且行数一致)。 - 所有输入
LazyFrame必须具有兼容的 schema:列名顺序不要求严格一致,但列名集合与对应数据类型必须匹配(Polars 会自动按名称对齐);若存在类型差异(如i64vsf64),需提前统一。 -
pl.concat()不支持rechunk=True等 DataFrame 专属参数,因其不涉及实际内存布局操作。 - 避免误用
vstack()或extend()—— 它们仅适用于DataFrame,对LazyFrame调用会直接报错。
? 小结:pl.concat() 是垂直合并 LazyFrame 的标准、高效且唯一推荐方式。它完美契合 Polars 的惰性计算范式,在复杂 ETL 流程中可安全嵌入多源数据拼接逻辑,显著提升大规模数据处理的可扩展性与响应速度。










