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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:53:12