
Polars 提供了 pl.concat() 函数,支持直接对多个 LazyFrame 进行惰性垂直拼接(即行方向合并),无需提前 .collect() 触发计算,从而避免内存与性能开销。
polars 提供了 `pl.concat()` 函数,支持直接对多个 `lazyframe` 进行惰性垂直拼接(即行方向合并),无需提前 `.collect()` 触发计算,从而避免内存与性能开销。
在 Polars 中,LazyFrame 的设计核心是延迟执行——所有操作仅构建执行计划,直到显式调用 .collect() 才真正执行。因此,垂直合并(即按行堆叠)两个 LazyFrame 时,应避免使用会强制物化数据的方法(如先 .collect() 再用 pandas 或 polars DataFrame 的 vstack),否则将丧失惰性优势。
正确做法是使用 polars.concat()(注意:是模块级函数 pl.concat(),而非 LazyFrame 实例方法)。该函数原生支持 LazyFrame 列表输入,并返回一个新的 LazyFrame,其执行计划已包含高效的流式追加逻辑:
import polars as pl
# 构造两个 LazyFrame
lf1 = pl.LazyFrame({"id": [101, 102], "name": ["Alice", "Bob"]})
lf2 = pl.LazyFrame({"id": [201, 202], "name": ["Charlie", "Diana"]})
# 惰性垂直合并(不触发计算)
combined_lf = pl.concat([lf1, lf2], how="vertical")
# 此时仍为 LazyFrame,可继续链式操作
result = combined_lf.filter(pl.col("id") > 150).select("name").collect()
print(result)
输出:
shape: (2, 1) ┌─────────┐ │ name │ │ --- │ │ str │ ╞═════════╡ │ Charlie │ │ Diana │ └─────────┘
✅ 关键要点:
-
pl.concat(..., how="vertical")是默认行为,适用于结构一致(列名、数量、类型兼容)的LazyFrame; - 若列顺序不同但语义相同,可设
rechunk=False并配合coalesce=True(需 Polars ≥ 0.20.0)提升鲁棒性; - 不支持
extend()或vstack()等实例方法——这是有意设计,强调“组合优先于修改”; - 与
join()不同,concat不改变列结构,仅扩展行数,适合日志合并、分片读取、A/B 测试结果聚合等场景。
⚠️ 注意事项:
- 列名必须完全匹配(大小写敏感),否则抛出
SchemaError;若需自动对齐,可先统一调用.rename(); - 类型不兼容时(如
i64vsf64),Polars 会尝试向上转型(如转为f64),但建议预先校验 schema 以保障稳定性; - 大量 LazyFrame 拼接时,
pl.concat([lf1, lf2, ..., lfN])比嵌套调用更高效——单次调用生成更优执行计划。
总之,pl.concat() 是 Polars 中垂直合并 LazyFrame 的标准、高效且符合惰性范式的解决方案。










