在python中进行数据匹配(模糊,列文斯坦?)

问题描述 投票:-2回答:1

我想做一些类似于excel模糊v-lookup的事情,但在python中,我有一个由大约10000个字符串组成的列表,比如。

JohnSmith5159LosAngeles
JaneDo7729NewYork
etc

我想在格式相同的列表中查找相似的字符串(我想指定%的匹配度),并将匹配度放在相邻的列中。希望能返回这样的结果。

JohnSmith5159LosAngeles |  JohnDSmith5159LosAngelez
JaneDo7729NewYork       |  JaneDoe7719NewYork
etc            

有谁知道有什么简单的已知脚本或方法可以做到这一点?)

python matching levenshtein-distance fuzzy
1个回答
1
投票

有内置的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
© www.soinside.com 2019 - 2024. All rights reserved.