如何在Polars DataFrame中统计字符串列中子串的重叠出现次数?
在Polars DataFrame中统计字符串列的重叠子串出现次数
Polars自带的pl.Expr.str.count_matches方法默认只会统计非重叠的子串匹配次数,无法满足重叠计数的需求。要统计重叠出现的次数,最直接高效的方法是利用**正则正向预查(positive lookahead)**来实现——预查不会消耗字符串中的字符,能连续匹配重叠的子串位置。
示例实现
import polars as pl df = pl.DataFrame({"foo": ["aaaaa", "aabaa", "aaaab"]}) # 用正向预查正则统计重叠子串次数 df = df.with_columns( pl.col("foo").str.count_matches(r"(?=aa)").alias("overlap_aa_count") ) print(df)
执行结果
shape: (3, 2) ┌───────┬────────────────┐ │ foo ┆ overlap_aa_count │ │ --- ┆ --- │ │ str ┆ u32 │ ╞═══════╪══════════════════╡ │ aaaaa ┆ 4 │ │ aabaa ┆ 2 │ │ aaaab ┆ 3 │ └───────┴──────────────────┘
原理说明
正则表达式(?=aa)是正向预断言,它的作用是检查当前位置之后是否存在子串"aa",但匹配后不会移动正则的匹配指针。这样在遍历字符串时,每一个能找到后续"aa"的位置都会被计数一次:
- 对于"aaaaa",位置0、1、2、3都满足后续有"aa",所以计数为4;
- 对于"aabaa",只有位置0和3满足,计数为2;
- 对于"aaaab",位置0、1、2满足,计数为3。
这种方法完全基于Polars原生API实现,不需要额外的循环或转换,性能最优,适合处理大规模数据集。
内容的提问来源于stack exchange,提问作者RastO
相关产品推荐
相关产品推荐

