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

