You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:16:21