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

如何在Polars中将结构体值提取为列表(替代map_elements方案)

不用map_elements实现Polars正则组转List[str]适配Streamlit

可以利用Polars结构体列的struct.to_list()内置方法,直接将extract_groups返回的结构体转换为List[str]类型,全程使用向量化表达式操作,比map_elements更高效,且适配匹配组数量0、1或更多的场景。

示例代码

import polars as pl
import streamlit as st

# 构造测试数据
df = pl.DataFrame({
    "text": [
        "Name: Alice, Age: 30",
        "Name: Bob",
        "No matches here",
        "Name: Charlie, Age: 25, City: New York"
    ]
})

# 带命名组的正则表达式
regex_pattern = r"Name: (?P<name>\w+)(?:, Age: (?P<age>\d+))?(?:, City: (?P<city>\w+))?"

# 提取正则组,得到结构体列
df = df.with_columns(
    pl.col("text").str.extract_groups(regex_pattern).alias("match_struct")
)

# 将结构体列转为List[str],无需map_elements
df = df.with_columns(
    # 把结构体的字段值转为列表,未匹配到的组会显示None
    pl.col("match_struct").struct.to_list().alias("matches_list")
    # 可选:将None替换为空字符串,优化显示效果
    # .list.eval(pl.element().fill_null(""))
)

# 在Streamlit中展示结果
st.table(df.select("text", "matches_list"))

关键说明

  1. struct.to_list()的作用:自动将结构体的所有字段值按定义顺序转换为列表,不管正则组的数量多少,都能统一输出List[str]类型。
  2. 处理未匹配的组:如果某个组没有匹配到内容,列表中对应位置会是None;如果需要替换为空字符串,可以追加.list.eval(pl.element().fill_null("")),依然无需使用map_elements。
  3. 性能优势:全程使用Polars的向量化表达式,相比逐元素处理的map_elements,在大数据量场景下运行效率更高。

内容的提问来源于stack exchange,提问作者David Waterworth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:11:02