Rust Polars如何将列表类型列横向展开为多个独立列
Polars 列表列按列拆分为多列的实现方案
Polars 提供了内置API直接实现这个需求,不需要手写循环遍历列表元素,核心是先将列表列转换为Struct类型,再将Struct列展开为独立列。
实现代码
针对你给出的Rust示例,完整可运行代码如下:
use polars::prelude::*; fn main() -> PolarsResult<()> { let s0 = Series::new("a", &[1i64, 2, 3]); let s1 = Series::new("b", &[1i64, 1, 1]); let s2 = Series::new("c", &[Some(2i64), None, None]); // 构造列表列 let list = Series::new("foo", &[s0, s1, s2]); let group_col = Series::new("Group", ["A", "B", "A"]); let cost_col = Series::new("Cost", [1, 1, 1]); let df = DataFrame::new(vec![group_col, cost_col, list])?; // 核心转换逻辑 let result = df .lazy() .with_column( col("foo") .list() // 将列表转为Struct,指定拆分后每个位置对应的列名 .to_struct(vec!["a".into(), "b".into(), "c".into()]) ) // 将Struct列展开为独立列 .unnest(["foo"]) .collect()?; dbg!(result); Ok(()) }
运行结果
上述代码执行后输出的DataFrame结构和内容完全匹配你的预期:
┌───────┬──────┬─────┬──────┬──────┐ │ Group ┆ Cost ┆ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i32 ┆ i64 ┆ i64 ┆ i64 │ ╞═══════╪══════╪═════╪══════╪══════╡ │ A ┆ 1 ┆ 1 ┆ 2 ┆ 3 │ ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤ │ B ┆ 1 ┆ 1 ┆ 1 ┆ 1 │ ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤ │ A ┆ 1 ┆ 2 ┆ null ┆ null │ └───────┴──────┴─────┴──────┴──────┘
注意事项
- 该方案兼容列表长度不一致的场景,长度不足的行会自动在对应位置填充null值。
- 如果不需要自定义列名,调用
to_struct时可以不传列名参数,Polars会自动生成field_0、field_1格式的默认列名,后续可通过rename方法批量修改。 - 该逻辑在Python等其他语言的Polars绑定中同样适用,核心都是列表转Struct + unnest展开两步操作。
内容的提问来源于stack exchange,提问作者Anatoly Bugakov
相关产品推荐
相关产品推荐

