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

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()步骤

对比你之前的两种实现

  1. 原list.eval方案:虽然可行,但嵌套的pl.when逻辑冗余,还需要手动处理空值,代码不够简洁
  2. map_elements+正则方案:这种逐行映射的方式性能最差,map_elements会绕开Polars的向量化优化,大数据量下速度慢很多,且正则表达式容易出现边界匹配问题(比如误匹配包含目标词汇的长单词)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:33:21