测试模糊匹配成功,为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:
| A | match | score |
|---|---|---|
| dog.Ronaldo | dog.Ron | 0.692308 |
| dog.Benjamin | dog.Benjamin | 1.0 |
| cat.Genevieve | dog.Gen | 0.454545 |
| dog.GermanShepherd | No Match | 0.0 |
| cat.Tom | cat.Tim | 0.8 |
关键说明
- 过滤
None值:避免将空值作为匹配候选,减少无效匹配逻辑。 - 拆分结果:利用
pd.Series将apply返回的元组直接转换为两列,无需手动循环处理每行。 - 异常捕获:针对
get_close_matches返回空列表的情况(无匹配结果),捕获IndexError并返回预设默认值。
内容的提问来源于stack exchange,提问作者SunflowerParty
相关产品推荐
相关产品推荐

