如何将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
相关产品推荐
相关产品推荐

