如何在Polars中将Struct转换为Series?(含cum_fold实操场景)
Polars将Struct列转换为常规Series列的方法
使用
pl.cum_fold()后得到一个包含Struct类型列的DataFrame,该DataFrame结构如下:┌───────────────────────────────────┐ │ price │ │ --- │ │ struct[2000] │ ╞═══════════════════════════════════╡ │ {null,null,null,null,30302.67187… │ └───────────────────────────────────┘希望将该Struct列转换为常规的Series列,目前只能通过转换为Python对象再转回DataFrame的方式实现:
df = pl.DataFrame(pl.Series('price', df[0, 0].values()))询问是否可以通过Polars表达式或工具方法实现该转换。
可以直接用Polars原生表达式完成转换,无需转成Python对象,以下是两种高效实现方式:
方式一:Struct转列表后展开
df = df.select(pl.col("price").struct.to_list()).explode("price")先通过
struct.to_list()把Struct的所有字段值转为列表,再用explode()将列表元素拆分为单独行,最终得到常规Series列的DataFrame。方式二:提取Struct字段后转长格式
如果需要保留原Struct字段名(若存在),可先提取所有字段再合并为单列:df = df.select(pl.col("price").struct.fields()).melt(value_name="price").select("price")struct.fields()提取Struct的所有字段为独立列,melt将多列合并为单个值列,最后仅保留目标price列即可。
这两种方法完全基于Polars内置操作,性能远优于转Python对象的方式,尤其适合处理大尺寸Struct数据。
内容的提问来源于stack exchange,提问作者Joris Medeišis
相关产品推荐
相关产品推荐

