我想做一些类似于excel模糊v-lookup的事情,但在python中,我有一个由大约10000个字符串组成的列表,比如。
JohnSmith5159LosAngeles
JaneDo7729NewYork
etc
我想在格式相同的列表中查找相似的字符串(我想指定%的匹配度),并将匹配度放在相邻的列中。希望能返回这样的结果。
JohnSmith5159LosAngeles | JohnDSmith5159LosAngelez
JaneDo7729NewYork | JaneDoe7719NewYork
etc
有谁知道有什么简单的已知脚本或方法可以做到这一点?)
有内置的difflib,它有返回字符串相似度比例的功能。
然后我写了一个函数来返回相似度最大的字符串,只要两个字符串之间的相似度比大于等于0.9就可以了。
有一个小捷径,就是检查两个字符串的第一个字母是否匹配。如果不符合,则不进行计算。这个思路来自这里。https: /stackoverflow.coma2047849342346
我猜你是在pandas中工作的,所以我添加了一个如何在pandas DataFrame中填充结果的例子。
from difflib import SequenceMatcher
def similar(a, b):
""" https://stackoverflow.com/a/17388505/42346 """
return SequenceMatcher(None, a, b).ratio()
def max_similar_string(s, l):
first_letter_match = [i for i in l if s[0] == i[0]]
if len(first_letter_match):
max_ratio = 0
max_ratio_string = ''
for i in l:
ratio = similar(i,s)
if ratio > max_ratio:
max_ratio = ratio
max_ratio_string = i
if max_ratio >= 0.9:
return (max_ratio_string,max_ratio)
else:
return (np.nan,np.nan)
l = ['JohnDSmith5159LosAngelez','JaneDoe7719NewYork']
df = pd.DataFrame({'s':['JohnSmith5159LosAngeles','JaneDo7729NewYork']})
for idx in df.index:
df.loc[idx,'similar'], df.loc[idx,'ratio'] = max_similar_string(df.loc[idx,'s'],l)
结果。
s similar ratio
0 JohnSmith5159LosAngeles JohnDSmith5159LosAngelez 0.936170
1 JaneDo7729NewYork JaneDoe7719NewYork 0.914286