Polars中如何更优筛选字符串内匹配指定列表的元素?
更简洁高效的Polars字符串元素筛选方案
最优简洁方案:用list.filter替代list.eval
直接用Polars原生的list.filter方法,比你现在用的list.eval写法更简洁,性能也更优——list.filter是专门为列表筛选设计的向量化操作,不需要嵌套pl.when再额外处理空值:
import polars as pl # 示例数据与指定词汇列表 df = pl.DataFrame({"text": ["apple banana cherry date", "banana date fig grape"]}) terms = ["banana", "date"] # 简洁实现 result_df = df.with_columns( pl.col("text") .str.split(" ") .list.filter(pl.element().is_in(terms)) .str.join(" ") .alias("filtered_text") ) print(result_df)
输出结果:
shape: (2, 2) ┌──────────────────────────┬─────────────────┐ │ text ┆ filtered_text │ │ --- ┆ --- │ │ str ┆ str │ ╞══════════════════════════╪═════════════════╡ │ apple banana cherry date ┆ banana date │ │ banana date fig grape ┆ banana date │ └──────────────────────────┴─────────────────┘
为什么这个方案更好?
- 代码更直观:省去了
list.eval(pl.when(...).then(pl.element()))的嵌套冗余写法,一步完成筛选 - 性能更出色:
list.filter是Polars原生向量化操作,比list.eval的嵌套逻辑执行效率更高,大数据集下优势明显 - 无需额外处理空值:
list.filter只会保留符合条件的元素,不会生成空值,省去了list.drop_nulls()步骤
对比你之前的两种实现
- 原
list.eval方案:虽然可行,但嵌套的pl.when逻辑冗余,还需要手动处理空值,代码不够简洁 map_elements+正则方案:这种逐行映射的方式性能最差,map_elements会绕开Polars的向量化优化,大数据量下速度慢很多,且正则表达式容易出现边界匹配问题(比如误匹配包含目标词汇的长单词)
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

