
在 Polars 中,若需将一个 LazyFrame 的列追加到另一个同行数的 LazyFrame 末尾,应使用 pl.concat(..., how="horizontal"),而非 with_columns——后者仅接受表达式或列名,不支持直接传入 LazyFrame。
在 polars 中,若需将一个 lazyframe 的列追加到另一个同行数的 lazyframe 末尾,应使用 `pl.concat(..., how="horizontal")`,而非 `with_columns`——后者仅接受表达式或列名,不支持直接传入 lazyframe。
当处理惰性计算(LazyFrame)时,保持计算图的延迟执行至关重要。with_columns 方法设计用于基于现有列构造新列(如 pl.col("a") + 1),它不接受另一个 LazyFrame 作为参数——这正是原代码报错的根本原因。
正确做法是使用 polars.concat() 并指定 how="horizontal" 参数,实现按列对齐的水平拼接。该操作要求两个 LazyFrame 行数严格一致(Polars 不自动校验,但运行时会因长度不匹配而报错),且列名不能冲突(否则后者的同名列将覆盖前者)。
以下为完整示例:
import polars as pl
# 原始 LazyFrame
df = pl.LazyFrame({
"a": [1, 2, 3],
"b": [4, 5, 6],
})
# 待添加列的 LazyFrame
other = pl.LazyFrame({
"c": [9, 10, 11],
"d": [12, 13, 14],
"e": [15, 16, 17],
})
# 仅选取需要的列,并水平拼接
result = pl.concat((df, other.select("c", "d")), how="horizontal")
# 执行并查看结果(.collect() 触发实际计算)
print(result.collect())
⚠️ 注意事项:
-
行数必须一致:
concat(..., how="horizontal")不进行索引对齐,仅按物理行序拼接,务必确保输入 LazyFrame 行数相同; - 列名去重优先级:若存在重名列,右侧 LazyFrame 的列将覆盖左侧同名列;
- 惰性安全:整个操作仍保留在 LazyFrame 计算图中,适合构建复杂管道;
-
性能友好:相比先
.collect()再用 pandas 拼接,此方式全程惰性、零中间内存拷贝。
如需动态选择列或条件拼接,可结合 other.select(pl.col(...).filter(...)) 等链式操作,进一步提升灵活性。










