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

如何将Rust Polars中List[struct]转换为标准行列结构?

Rust Polars 转换 list[struct] 为标准行列结构

问题背景

当前使用Rust Polars处理REST接口返回的数据,得到的DataFrame为shape(5,1)的单列结构,列类型是list[struct[2]],示例数据如下:

shape: (5, 1)
┌───────────────────────────────────┐
│ fields                            │
│ ---                               │
│ list[struct[2]]                   │
╞═══════════════════════════════════╡
│ [{"colum1","valueC1_row1"}, {"column2","valueC2_row1"}], ..│
│ [{"colum1","valueC1_row2"}, {"column2","valueC2_row2"}], ..│
│ [{"colum1","valueC1_row3"}, {"column2","valueC2_row3"}], ..│
│ [{"colum1","valueC1_row4"}, {"column2","valueC2_row4"}], ..│
│ [{"colum1","valueC1_row5"}, {"column2","valueC2_row5"}], ..│
└───────────────────────────────────┘

需要将每个struct的键作为列名,对应值作为该行数据,转换为如下标准行列结构:

┌───────────────────────────────────┐
│ colum1 │ colum2 | ....            |
│ ---    | ---    |                 │
│ string | string | ....            │
╞═══════════════════════════════════╡
valueC1_row1|valueC2_row1
valueC1_row2|valueC2_row2
valueC1_row3|valueC2_row3
valueC1_row4|valueC2_row4
valueC1_row5|valueC2_row5

实现思路

  • 固定字段场景:直接提取list中struct的指定字段生成新列
    利用arr.eval配合struct.field,针对每个目标字段提取对应值,最后删除原列即可:

    use polars::prelude::*;
    
    // 假设df是已加载的原始DataFrame
    let df_result = df
        .with_column(
            col("fields")
                .arr()
                .eval(lit(0).struct_field("colum1"), false)
                .alias("colum1")
        )
        .with_column(
            col("fields")
                .arr()
                .eval(lit(0).struct_field("column2"), false)
                .alias("column2")
        )
        .drop("fields");
    
  • 动态字段场景:自动识别struct的字段名批量处理
    如果struct的键不固定,先从第一行数据中提取所有字段名,再循环生成对应列:

    use polars::prelude::*;
    
    // 获取所有struct字段名
    let field_names = df
        .column("fields")?
        .arr()
        .first()?
        .struct_()?
        .fields()
        .iter()
        .map(|s| s.as_str())
        .collect::<Vec<_>>();
    
    // 批量生成字段列
    let mut df_result = df.clone();
    for name in field_names {
        df_result = df_result.with_column(
            col("fields")
                .arr()
                .eval(lit(0).struct_field(name), false)
                .alias(name),
        );
    }
    df_result = df_result.drop("fields");
    

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:30:20