本文介绍使用 Polars 内置表达式 pl.int_ranges() 高效创建列表列的方法,替代低效的 map_rows,支持向量化计算、类型安全且可无缝集成到链式操作中。
本文介绍使用 polars 内置表达式 `pl.int_ranges()` 高效创建列表列的方法,替代低效的 `map_rows`,支持向量化计算、类型安全且可无缝集成到链式操作中。
在 Polars 中,若需根据某整数列(如 length)为每行生成一个从 0 开始、长度动态变化的整数列表(例如 length=5 → [0, 1, 2, 3, 4]),最推荐的方式是使用专为此类场景设计的向量化表达式 pl.int_ranges()。该函数接受列名或表达式作为上界(默认下界为 0,步长为 1),直接返回 list[i64] 类型列,性能远超逐行处理。
以下为完整示例:
import polars as pl
df = pl.DataFrame({"length": [3, 5, 8]})
result = df.with_columns(
pl.int_ranges("length").alias("list")
)
print(result)输出:
shape: (3, 2) ┌────────┬─────────────┐ │ length ┆ list │ │ --- ┆ --- │ │ i64 ┆ list[i64] │ ╞════════╪═════════════╡ │ 3 ┆ [0, 1, 2] │ │ 5 ┆ [0, 1, … 4] │ │ 8 ┆ [0, 1, … 7] │ └────────┴─────────────┘
✅ 优势说明:
- 零拷贝 & 向量化:pl.int_ranges 在底层以 Rust 实现,避免 Python 层循环与对象构造开销;
- 类型推导准确:自动推断输出列为 list[i64],无需手动指定 dtype;
- 可组合性强:可与其他表达式嵌套,例如 pl.int_ranges(pl.col("length") - 1) 实现自定义偏移;
- 内存友好:相比 map_rows 生成中间 Python list 对象,它直接构建 Polars 原生列表列,减少 GC 压力。
⚠️ 注意事项:
- 输入列必须为整数类型(i64, i32 等),浮点数或空值将引发错误;若存在缺失值,建议先用 .fill_null(0) 或 .clip_min(0) 处理;
- pl.int_ranges 默认从 0 开始、步长为 1;如需其他起始值或步长,可显式传入 low 和 step 参数,例如:
pl.int_ranges(low=1, high="length", step=2) # 生成 [1, 3, 5, ...]
总之,面对“每行生成动态 range 列”的需求,应优先选用 pl.int_ranges —— 它是 Polars 提供的语义清晰、性能卓越的标准解法。

















