将字符串列表(一次一个元素)与另一字符串列表中的所有元素进行比较

时间:2019-04-04 14:09:47

标签: python sql-server-2017

我有一个包含ID,NamesA和NamesB的数据集。

最初,我被要求将每一行的NamesA与NamesB进行比较,并产生所示的代码。这给了我所需的结果(除了写csv而不是写回SQL)。

现在我被要求将NamesA中的每个元素与NamesB中的所有元素进行比较,并在新列中返回ID,以查找匹配项和相似字符串。

我尝试使用Google搜索此问题,搜索了许多不同的stackoverflow问题,但是由于我对Python和编程语言的总体经验不足,因此无法找到/应用正确的答案。

我发现很难知道如何解决这个问题,尝试使用for循环,但失败了!

源数据在SQL Server中,我的同事无法执行此任务。我已经开始学习Python,但是成功有限(同样由于我的经验不足)。

import pypyodbc
import pandas as pd
import jellyfish

cnxn = pypyodbc.connect("Driver=driver;"
                        "Server=server;"
                        "Database=db;"
                        "uid=user;pwd=password")

df = pd.read_sql_query('select top 100 [ID],[NamesA],[NamesB] from [table]', cnxn)

def similar(a, b):
    similarity = jellyfish.levenshtein_distance(str(a),str(b))
    return similarity

df['Similarity'] = df.apply(lambda z: similar(z['NamesA'],z['NamesB']), axis = 1)

df.to_csv("path.csv")

使用水母提供了可用于此任务的图形,但我只能将其用于个人比较。

理想情况下,我希望产生类似的结果,其中0的等级将ID分配给MatchIDs列,而介于1到5之间的任何话都将ID分配给SameIDs列。

¦ID ¦NamesA             ¦NamesB         ¦MatchedIDs ¦SimilarIDs
¦1  ¦Carly Thornton     ¦Ayla Vaughn    ¦2          ¦3, 4
¦2  ¦Falak Major        ¦Carly Thornton ¦null       ¦4
¦3  ¦Falak Vaughn       ¦Carly Major    ¦null       ¦1, 4
¦4  ¦Ayla Waller        ¦Falak Thornton ¦null       ¦1



更新-我认为我已经设法使用嵌套的for循环来应用该功能,但仍然无法按需返回ID。这种方法的测试速度也很慢,仅占总数据的1/60。

for i in df["NamesA"]:
    for e in df["NamesB"]:
        if similar(i,e) < 5:
            print(i,e) 

0 个答案:

没有答案