如何在Polars中使用list.count_matches处理多匹配参数?
高效统计Polars列表列与多目标值的匹配数量
针对你遇到的list.count_matches仅支持单个值的问题,推荐使用Polars的向量化列表操作来高效实现多目标值的匹配计数,无需Python循环。
实现代码
import polars as pl src = pl.DataFrame( { "c1": ["a", "b", "c", "d"], "c2": [[0], [2, 3, 4], [3, 4, 7, 9], [3, 9]], } ) targets = pl.Series([3, 7, 9]) # 添加匹配计数列 dst = src.with_columns( match_count=pl.col("c2").list.eval(pl.element().is_in(targets).sum()) ) print(dst)
输出结果
shape: (4, 3) ┌─────┬───────────────┬─────────────┐ │ c1 ┆ c2 ┆ match_count │ │ --- ┆ --- ┆ --- │ │ str ┆ list[i64] ┆ i64 │ ╞═════╪═══════════════╪═════════════╡ │ a ┆ [0] ┆ 0 │ │ b ┆ [2, 3, 4] ┆ 1 │ │ c ┆ [3, 4, 7, 9] ┆ 3 │ │ d ┆ [3, 9] ┆ 2 │ └─────┴───────────────┴─────────────┘
核心原理与优势
- 向量化执行:
list.eval是Polars专为列表列设计的向量化操作,底层由Rust实现,性能远优于Python层面的逐行遍历(如apply)。 - 集合匹配优化:
is_in(targets)会利用Polars的集合查找逻辑,快速判断元素是否属于目标值集合,再通过sum()统计匹配的布尔值数量。 - 懒执行支持:默认情况下Polars会延迟执行操作,可与其他数据处理步骤合并优化,进一步提升整体效率。
性能优化建议
若目标值集合规模较大,可先将targets转换为Python集合,进一步加快is_in的查找速度:
target_set = set(targets.to_list()) dst = src.with_columns( match_count=pl.col("c2").list.eval(pl.element().is_in(target_set).sum()) )
内容的提问来源于stack exchange,提问作者Konstantin Druzhkin
相关产品推荐
相关产品推荐

