Polars中struct列转list列:实现反向拆分与行展开需求
解决Polars中Struct列转List列及反向拆分需求
核心结论:Struct列可以转为List列
你尝试的struct.to_list()是正确的方向,可能是写法细节问题。Polars中可通过.struct.to_list()方法将Struct列转为List列,以下是针对你两个需求的具体实现:
需求A:实现类似Python rsplit的反向拆分效果
str.splitn("/", 2)是从左往右拆分2次,要模拟从右往左的rsplit效果,有两种高效实现方式:
方式1:直接反转Struct字段顺序(无需转List)
利用已命名的Struct字段,直接调换顺序即可:
df = data.with_columns( pl.struct( pl.col("onboarded_date").str.splitn("/", 2).struct.field("column2"), pl.col("onboarded_date").str.splitn("/", 2).struct.field("column1") ).alias("reversed_fields") )
方式2:转List后反转(逻辑更直观)
先将Struct转为List列,再调用.list.reverse()完成反转:
df = data.with_columns( pl.col("onboarded_date") .str.splitn("/", 2) .struct.rename_fields(["column1", "column2"]) .struct.to_list() # 将Struct转为List列 .list.reverse() # 反转List元素顺序 .alias("reversed_fields") )
需求B:将Struct展开为行(而非列)
先把Struct转为List列,再用explode方法展开成行即可。结合需求A的反转逻辑,完整代码如下:
out = data.with_columns( pl.col("onboarded_date") .str.splitn("/", 2) .struct.rename_fields(["column1", "column2"]) .struct.to_list() .list.reverse() .alias("fields") ).explode("fields")
更简洁的替代方案(跳过中间Struct)
如果不需要保留Struct的中间状态,也可以通过反转原字符串实现反向拆分,再还原内容:
out = data.with_columns( pl.col("onboarded_date") .str.reverse() # 反转原字符串,将右侧分隔符转为左侧 .str.splitn("/", 2) .struct.to_list() .list.map(lambda x: x.str.reverse()) # 还原每个拆分元素的原始顺序 .alias("fields") ).explode("fields")
内容的提问来源于stack exchange,提问作者imthomas
相关产品推荐
相关产品推荐

