You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:42:29