
Polars 提供了 pl.concat() 函数,专为惰性计算场景设计,可直接合并多个 LazyFrame 实现零开销的垂直拼接,避免调用 .collect() 导致的内存与计算浪费。
polars 提供了 `pl.concat()` 函数,专为惰性计算场景设计,可直接合并多个 `lazyframe` 实现零开销的垂直拼接,避免调用 `.collect()` 导致的内存与计算浪费。
在 Polars 中,LazyFrame 的核心优势在于延迟执行——所有操作仅构建执行计划,直到显式调用 .collect() 才真正触发计算。因此,垂直合并(即按行堆叠)两个 LazyFrame 时,绝不能先调用 .collect() 转为 DataFrame 再拼接,否则将失去惰性优势,引发不必要的内存占用和性能损耗。
幸运的是,polars.concat() 完全支持 LazyFrame 输入,并默认执行垂直合并(等价于 how="vertical")。它会智能地对齐列名与数据类型:要求所有输入 LazyFrame 具有完全一致的列名顺序和兼容的数据类型;若列数或类型不匹配,将在 .collect() 阶段报错(而非立即失败),便于调试执行计划。
✅ 正确用法示例:
import polars as pl
lf1 = pl.LazyFrame({"id": [1, 2], "value": ["a", "b"]})
lf2 = pl.LazyFrame({"id": [3, 4], "value": ["c", "d"]})
# 惰性拼接:仅构建执行计划,无实际计算
merged_lf = pl.concat([lf1, lf2])
# 最终一次性执行(可选:也可继续链式操作,如 filter、select 等)
result = merged_lf.filter(pl.col("id") > 2).collect()
print(result)
# shape: (2, 2)
# ┌─────┬───────┐
# │ id ┆ value │
# │ --- ┆ --- │
# │ i64 ┆ str │
# ╞═════╪═══════╡
# │ 3 ┆ c │
# │ 4 ┆ d │
# └─────┴───────┘⚠️ 注意事项:
- 不要使用
vstack()或extend():二者仅适用于DataFrame,对LazyFrame未实现; - 列对齐是严格匹配的:列名、顺序、数据类型需兼容(例如
Int64与Int32可自动提升,但String与Int64会报错); - 若需处理列不一致的场景,应在
concat前统一 schema(例如用.select()或.cast()标准化); -
pl.concat(..., how="horizontal")用于水平合并(列拼接),但要求行数相同,且不适用于多数垂直合并需求。
总结:pl.concat() 是垂直合并 LazyFrame 的标准、高效且唯一推荐方式。它完美契合 Polars 的惰性范式,让大规模数据流水线保持轻量、可组合与高性能。

















