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

测试模糊匹配成功,为Pandas DataFrame新增匹配列时结果异常

解决Pandas DataFrame模糊匹配新增列问题

问题分析

你单独测试模糊匹配逻辑时能正常运行,但封装函数或使用apply给DataFrame新增列时出错,核心问题如下:

  • 异常代码1:循环中直接给整列赋值,每次循环都会覆盖之前的结果;未在循环内获取匹配结果,也未定义best_match函数。
  • 异常代码2:在外层额外添加了循环,apply本身已实现逐行处理列A的所有元素,无需额外循环;同时缺少best_match函数的具体实现。

正确实现方案

1. 定义完整的匹配函数

先编写一个函数,接收单个待匹配字符串和匹配候选列表,返回匹配结果及对应的相似度得分:

import pandas as pd
from difflib import get_close_matches, SequenceMatcher

def get_match_and_score(text, patterns):
    # 过滤候选列表中的None值,避免无效匹配
    valid_patterns = [p for p in patterns if p is not None]
    try:
        best_match = get_close_matches(text, valid_patterns, n=1)[0]
        score = SequenceMatcher(None, text, best_match).ratio()
        return best_match, score
    except IndexError:
        # 无匹配结果时返回指定默认值
        return 'No Match', 0.0

2. 应用函数到DataFrame

直接对列A使用apply,将返回的元组拆分为match和score两列:

# 初始化DataFrame
df = pd.DataFrame({
    "A": ['dog.Ronaldo','dog.Benjamin','cat.Genevieve', 'dog.GermanShepherd', 'cat.Tom'], 
    "B": ['dog.Ron', 'dog.Gen', 'dog.Benjamin', 'cat.Tim', None]
})
# 提取列B的有效值作为匹配候选(也可直接使用你定义的patterns列表)
patterns = [p for p in df['B'] if p is not None]

# 应用函数并拆分结果为两列
df[['match', 'score']] = df['A'].apply(
    lambda x: pd.Series(get_match_and_score(x, patterns))
)

# 可选:删除列B
df = df.drop('B', axis=1)

print(df)

运行结果

执行后会得到符合期望的DataFrame:

Amatchscore
dog.Ronaldodog.Ron0.692308
dog.Benjamindog.Benjamin1.0
cat.Genevievedog.Gen0.454545
dog.GermanShepherdNo Match0.0
cat.Tomcat.Tim0.8

关键说明

  • 过滤None值:避免将空值作为匹配候选,减少无效匹配逻辑。
  • 拆分结果:利用pd.Series将apply返回的元组直接转换为两列,无需手动循环处理每行。
  • 异常捕获:针对get_close_matches返回空列表的情况(无匹配结果),捕获IndexError并返回预设默认值。

内容的提问来源于stack exchange,提问作者SunflowerParty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:27:55