如何在Polars中从列表内所有结构体中选取字段?
解决方案
可以通过Polars的列表和结构体操作实现动态提取,无需硬编码列表长度,具体代码如下:
import polars as pl data = { "a": [ [{ "x": [1, 2, 3], "y": [4, 5, 6] }, { "x": [2, 3, 4], "y": [3, 4, 5] } ] ], } df = pl.DataFrame(data) # 动态提取并生成目标列 result = df.select( pl.col("a") # 遍历列表中的每个结构体,提取"x"字段 .list.eval(pl.element().struct.field("x")) # 将提取后的列表转为结构体,自动生成x_1、x_2...格式的字段名 .list.to_struct(names=lambda idx: f"x_{idx+1}") # 将结构体拆分为独立列 .struct.unnest() ) print(result)
步骤说明
list.eval(pl.element().struct.field("x")):对列a中的每个列表元素(结构体),逐一提取x字段,得到一个包含所有目标列表的新列表。list.to_struct(names=lambda idx: f"x_{idx+1}"):将提取后的列表转换为结构体,通过lambda函数根据元素索引动态生成x_1、x_2这类字段名。struct.unnest():将结构体的每个字段拆分为单独的列,得到最终的DataFrame结构。
这个方案完全适配未知长度的列表,无论原列表包含多少个结构体,都会自动生成对应数量的列。
内容的提问来源于stack exchange,提问作者Ludde
相关产品推荐
相关产品推荐

