如何用Polars原生方法匹配每行字符串与多组模式列表?
Polars原生实现多模式全匹配方案
示例数据
先定义两个测试用DataFrame:
import polars as pl df_str = pl.DataFrame( {"id": [1, 2, 3], "text": ["hello world python", "foo bar baz", "python data analysis"]} ) df_pat = pl.DataFrame( {"pat_id": [101, 102], "patterns": [["python", "world"], ["foo", "baz"]]} )
实现代码
直接用Polars的向量化操作替代循环:
result = ( # 给每个模式组加索引,展开模式列表为单行 df_pat.with_row_index("pat_group_idx") .explode("patterns") # 交叉关联字符串DataFrame,生成所有组合 .join(df_str, how="cross") # 检查单个模式是否匹配对应文本 .with_columns( matches=pl.col("text").str.contains(pl.col("patterns"), case_sensitive=False) ) # 按模式组+字符串ID分组,验证组内所有模式都匹配 .group_by(["pat_group_idx", "pat_id", "id", "text"]) .agg( pl.col("matches").all().alias("all_matched"), pl.col("patterns").list().alias("matched_patterns") ) # 过滤出全匹配成功的记录 .filter(pl.col("all_matched")) # 整理成目标输出格式 .select("id", "pat_group_idx", "pat_id", "text", "matched_patterns") ) print(result)
逻辑说明
with_row_index:给每个模式组分配唯一索引,方便后续分组聚合explode:将模式列表拆分为单行,实现逐个模式的匹配检查cross join:生成字符串与模式组的所有可能组合,覆盖全部匹配场景str.contains:完成单个模式与字符串的匹配判断group_by + agg(all()):对每个模式组-字符串组合,验证是否所有模式都匹配成功- 最后过滤有效结果并整理字段,得到包含匹配索引和模式的目标输出
该方案完全基于Polars原生向量化操作,避免Python循环带来的性能损耗,数据量越大优势越明显。
内容的提问来源于stack exchange,提问作者mavex857
相关产品推荐
相关产品推荐

