我有一个包含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)