如何在Polars DataFrames间实现高效模糊匹配(规避逐行迭代)
向量化实现Polars DataFrame的模糊字符串匹配映射
当然可以用向量化方式替代逐行迭代,核心思路是通过**交叉连接(cross join)**生成所有可能的条目组合,再批量计算模糊匹配分数,全程利用Polars的向量化引擎处理,效率比循环高得多。
优化后的向量化代码
import polars as pl from polars_fuzzy_match import fuzzy_match_score # 示例数据 wg_df = pl.DataFrame({"wg_id": [1, 2], "utility_name": ["Utility A", "Utility B"]}).rename({"utility_name": "wg_utility_name"}) eia_df = pl.DataFrame( {"eia_id": [101, 102, 103], "utility_name": ["Utility A co.", "Utility B", "utility c"]} ) # 向量化实现逻辑 out = ( # 交叉连接生成所有wg与eia的条目组合 wg_df.join(eia_df, how="cross") # 批量计算所有配对的模糊匹配分数 .with_columns(score=fuzzy_match_score(pl.col("wg_utility_name"), pl.col("utility_name"))) # 过滤掉分数为空的无效匹配 .filter(pl.col("score").is_not_null()) # 按wg_id分组,组内按分数降序排序(和原逻辑一致) .sort(["wg_id", "score"], descending=[False, True]) # 调整列顺序,与原输出结构对齐 .select(["wg_id", "eia_id", "wg_utility_name", "utility_name", "score"]) ) print(out)
关键步骤说明
- 交叉连接:
join(how="cross")直接生成每个wg条目与所有eia条目的配对,无需逐行遍历。 - 批量计算分数:
fuzzy_match_score直接处理两列数据,完全向量化,Polars会自动并行计算,比循环快数倍。 - 排序与过滤:按
wg_id分组后排序,保留原逻辑中每个wg条目对应的所有匹配结果(按分数从高到低)。
可选:仅保留最优匹配
如果只需要每个wg条目的最高分数匹配,可在排序后添加分组聚合:
out = ( wg_df.join(eia_df, how="cross") .with_columns(score=fuzzy_match_score(pl.col("wg_utility_name"), pl.col("utility_name"))) .filter(pl.col("score").is_not_null()) .sort(["wg_id", "score"], descending=[False, True]) .group_by("wg_id") .agg(pl.all().first()) # 保留每个组内分数最高的第一条 .select(["wg_id", "eia_id", "wg_utility_name", "utility_name", "score"]) )
内容的提问来源于stack exchange,提问作者nickolasclarke
相关产品推荐
相关产品推荐

