问题描述
我有一个包含 100 万条记录“A”的数据框和一个包含 1000 条记录“B”的较小数据框,我想将其添加到数据框“A”中。
这里有一个问题:某些记录可能已经在表 'A' 中,名称略有不同,我不想添加重复项。因此,我们的想法是为数据框“B”的记录提出一个相似性分数,这样我就可以得出一个截止值,留下一个干净的数据框“B”来添加到数据框“A”中。
例如:数据框“A”包含一百万条街道名称记录。
邮编 | 街道 |
---|---|
1234 | 花街1 |
1234 | 玫瑰街2 |
1234 | 狗街 3 |
1234 | 猫街 4 |
1234 | 老鼠街5 |
数据框“B”:
邮编 | 街道 |
---|---|
1234 | 花街1 |
1234 | 独特的街道2 |
1234 | Dogg Ztreet 3 |
1234 | Unique Street 4 |
1234 | Mouz Str 5 |
我想象决赛桌看起来像这样,例如,我会在稍后删除得分 >75% 的记录。
邮编 | 街道 | 得分 |
---|---|---|
1234 | 花街1 | 90% |
1234 | 独特的街道2 | 5% |
1234 | Dogg Ztreet 3 | 78% |
1234 | Unique Street 4 | 1% |
1234 | Mouz Str 5 | 84% |
现在,在考虑创建某个分数之前,我一直在思考如何仅从较小的数据帧“B”中选择一条记录,以将其与“A”的整个数据帧进行比较。
有人知道吗?
解决方法
您可以使用 Levenshtein 算法来比较两个字符串的相似度。我认为为您比较的每条记录提供一个截止点对您来说可能会很有效。
https://pypi.org/project/python-Levenshtein/
示例代码如下:- https://github.com/iainonline/levexample.git
import Levenshtein as lev
a = 'compare this'
b = 'to this'
Distance = lev.distance(a.lower(),b.lower())
Ratio = lev.ratio(a.lower(),b.lower())
print('Levenshtein distance is: ',Distance)
print('Levenshtein ratio is: ',Ratio)
输出将是:
Levenshtein 距离为:6
莱文斯坦比率为:0.631578947368421