如何在Polars中展开包含结构体列表的DataFrame列?
解决方案
你可以通过先拆分列表行,再展开结构体字段的两步操作完成转换,具体代码如下:
import polars as pl # 原始DataFrame df = pl.DataFrame( { "id": [1, 2, 3], "s": [ [{"a": 1, "b": 1}, {"a": 2, "b": 2}, {"a": 3, "b": 3}], [{"a": 10, "b": 10}, {"a": 20, "b": 20}, {"a": 30, "b": 30}, {"a": 40, "b": 40}], [{"a": 100, "b": 100}, {"a": 200, "b": 200}, {"a": 300, "b": 300}, {"a": 400, "b": 400}, {"a": 500, "b": 500}], ], } ) # 执行转换 result_df = df.explode("s").unnest("s") print(result_df)
操作说明
explode("s"):将s列中的每个列表元素拆分为独立行,此时每行的s字段为单个结构体类型unnest("s"):将结构体类型的s字段展开为a、b两个独立列,同时保留id列与各行的对应关系
执行后得到的结果与你期望的长格式DataFrame完全一致:
shape: (12, 3) ┌─────┬─────┬─────┐ │ id ┆ a ┆ b │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ 1 ┆ 1 ┆ 1 │ │ 1 ┆ 2 ┆ 2 │ │ 1 ┆ 3 ┆ 3 │ │ 2 ┆ 10 ┆ 10 │ │ 2 ┆ 20 ┆ 20 │ │ … ┆ … ┆ … │ │ 3 ┆ 300 ┆ 300 │ │ 3 ┆ 400 ┆ 400 │ │ 3 ┆ 500 ┆ 500 │ └─────┴─────┴─────┘
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

