我试图模糊地匹配两个csv文件,每个文件都包含一列相似但不相同的名称。
我的代码如下:
import pandas as pd
from pandas import DataFrame
from fuzzywuzzy import process
import csv
save_file = open('fuzzy_match_results.csv', 'w')
writer = csv.writer(save_file, lineterminator = '\n')
def parse_csv(path):
with open(path,'r') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
yield row
if __name__ == "__main__":
## Create lookup dictionary by parsing the products csv
data = {}
for row in parse_csv('names_1.csv'):
data[row[0]] = row[0]
## For each row in the lookup compute the partial ratio
for row in parse_csv("names_2.csv"):
#print(process.extract(row,data, limit = 100))
for found, score, matchrow in process.extract(row, data, limit=100):
if score >= 60:
print('%d%% partial match: "%s" with "%s" ' % (score, row, found))
Digi_Results = [row, score, found]
writer.writerow(Digi_Results)
save_file.close()
输出如下:
Name11 , 90 , Name25
Name11 , 85 , Name24
Name11 , 65 , Name29
剧本写得很好。产出如预期。 但我要找的只是最好的匹配。
Name11 , 90 , Name25
Name12 , 95 , Name21
Name13 , 98 , Name22
因此,我需要根据第2列中的最大值,以某种方式删除第1列中的重复名称。 这应该很简单,但我似乎想不出来。 任何帮助都将不胜感激。
使用FuzzyWuzzy中的
process.extractOne()
可以大大简化代码的几个部分。它不仅返回顶级匹配,您还可以在函数调用中为它设置分数阈值,而不需要执行单独的逻辑步骤,例如:如果找到满足条件的匹配项,此函数将返回最高匹配项的元组加上相应的分数。否则它将返回
None
。fuzzywuzzy的
process.extract()
以相反的顺序返回列表,最好的匹配在前面。所以为了找到最佳匹配,可以将limit参数设置为
1
,这样它只返回最佳匹配,如果大于60,就可以像现在这样将其写入csv。示例-
我只是为自己写了同样的东西但是在熊猫身上。。。。
我已经使用了50的阈值-但它是可配置的。
数据框架1看起来像
数据框架2看起来像
所以运行它会产生
希望这有帮助。
相关问题 更多 >
编程相关推荐