如何在Polars的列表类型列中过滤指定邮箱元素?
Polars过滤列表中符合结尾条件的邮箱元素
直接解决方案
使用Polars的list.filter结合str.ends_with可以高效实现需求,代码如下:
import polars as pl df = pl.DataFrame( { "subject": ["subject1", "subject2"], "emails": [ ["samATxyz.com", "janeATxyz.com", "jimATcustomer.org"], ["samATxyz.com", "zaneATxyz.com", "basATcustomer.org", "jimATcustomer.org"], ], } ) # 过滤emails列表中以"ATxyz.com"结尾的元素 result_df = df.with_columns( pl.col("emails").list.filter(pl.element().str.ends_with("ATxyz.com")) ) print(result_df)
执行后输出:
shape: (2, 2) ┌──────────┬───────────────────────────────────┐ │ subject ┆ emails │ │ --- ┆ --- │ │ str ┆ list[str] │ ╞══════════╪═══════════════════════════════════╡ │ subject1 ┆ ["samATxyz.com", "janeATxyz.com"] │ │ subject2 ┆ ["samATxyz.com", "zaneATxyz.com"] │ └──────────┴───────────────────────────────────┘
关键逻辑说明
list.filter:Polars专为列表类型提供的过滤方法,传入布尔表达式即可筛选列表内符合条件的元素。pl.element():指代列表中的每个元素,用于在列表上下文里编写针对单个元素的判断逻辑。str.ends_with("ATxyz.com"):精准匹配字符串结尾,相比str.contains更贴合需求,避免误匹配中间包含目标字符串的邮箱。
基于你原有思路的改进
如果想用list.eval实现,可在eval内部对元素进行过滤,代码如下:
df.with_columns( pl.col("emails").list.eval(pl.element().filter(pl.element().str.ends_with("ATxyz.com"))) )
不过list.filter语法更直观,推荐优先使用。
关于explode的说明
用explode重塑数据虽然可行,但需要经历展开列表→过滤→分组聚合回列表三个步骤,代码冗余且性能不如直接操作列表的方法,尤其在数据量较大时差异明显,因此不推荐。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

