使用Python Pandas get_close_matches无法关联查找表完整匹配数据的问题
问题分析与解决方案
你遇到的核心问题是get_close_matches仅返回匹配字符串而非索引,再加上原代码存在拼写错误、行对象复用、索引逻辑混乱等问题,导致无法正确关联所有匹配项的查找表数据。
原代码的关键错误
- 缺少模块导入:
get_close_matches属于difflib模块,必须先导入才能调用。 - 列名拼写错误:查找表列名为
Key(大写K),但代码中写成lookupRow['key'](小写k),导致匹配信息无法正确赋值。 - 行对象复用与索引覆盖:循环中始终修改同一个
row对象,并用浮点数索引覆盖写入结果表,最终只会保留最后一次匹配内容,且索引逻辑混乱。
修正后的代码
import pandas as pd from difflib import get_close_matches lookup_df = pd.DataFrame({'Key': ['rot', 'gelb', 'rote'], 'Name1': ['Peter', 'Hans', 'Gustav'], 'Name2': ['Pan', 'Wurst', 'Kraut']}) search_df = pd.DataFrame({'Key': ['rot', 'blau', 'gelb']}) # 初始化结果列表,存储每个匹配项的完整行数据 results = [] for _, search_row in search_df.iterrows(): search_key = search_row['Key'] # 获取所有符合相似度要求的匹配Key matched_keys = get_close_matches(search_key, lookup_df['Key'], n=10, cutoff=0.8) # 为每个匹配项生成独立的结果行 for matched_key in matched_keys: # 定位查找表中对应的行(假设Key唯一,用iloc[0]取第一行) lookup_row = lookup_df[lookup_df['Key'] == matched_key].iloc[0] # 复制搜索行并添加匹配信息 result_row = search_row.copy() result_row['Matched Key'] = matched_key result_row['Matched Name 1'] = lookup_row['Name1'] result_row['Matched Name 2'] = lookup_row['Name2'] # 将结果行加入列表 results.append(result_row) # 将结果列表转换为DataFrame resultDF = pd.DataFrame(results) print(resultDF)
代码说明
- 正确导入模块:添加
from difflib import get_close_matches确保函数可用。 - 独立结果行:为每个匹配项复制新的行对象,避免内容被覆盖。
- 准确关联数据:通过
lookup_df['Key'] == matched_key定位对应行,用正确列名提取数据。 - 清晰结果结构:最终
resultDF会为每个匹配项生成一行,比如搜索rot时,会同时输出rot和rote对应的两组名称数据。
内容的提问来源于stack exchange,提问作者user1104836
相关产品推荐
相关产品推荐

