python - 使用自定义函数合并两个 Python 数据帧以进行近似匹配和阈值分数
问题描述
我有两个包含网址和顶级域的数据框。df1 有~百万行,df2 有~700k 行。我需要合并这两个数据框以获取公共网址和相应的域以及每个数据框独有的列。因为抄录网址和域会导致拼写错误,所以我需要使用近似合并进行合并。
这是一个例子:
df1
address tld test
0 google .com 14100
1 stackoverflow .net 19587
2 yahoo! .com 21633
3 bbcc .com 9633
4 nytimes .net 61933
df2
address tld type
0 google .com 1
1 stackoverrfloow .net 5
2 bbc .com 4
4 nytimes .com 1
这是我期望的输出:
输出
address tld test type
0 google .com 14100 1
1 stackoverflow .net 19587 5
2 bbcc .com 9633 4
我创建了一个使用 Levenshtein 距离返回百分比匹配的函数。这是一个简单的函数,将两个字符串作为输入,并返回匹配百分比。例如:
string1 = "stackoverflow"
string2 = "stackoverrfloow"
pct_match = pctLevenshtein(string1, string2)
这给了我 0.87 的匹配百分比。如何使用此函数以及近似匹配足够好的阈值分数对地址和 tld 列进行近似匹配以创建输出数据帧?输出只是一个样本,它也可能根据阈值分数选择“nytimes”。我已经尝试使用 difflib 的 get_close_matches 来查找近似匹配然后合并,但这并不是我想要做的。
df2['key1'] = df2.address.map(lambda x: difflib.get_close_matches(x, df1.address)[0])
df2['key2'] = df2.tld.map(lambda x: difflib.get_close_matches(x, df1.tld)[0])
到目前为止我所尝试的一切都没有奏效。我正在寻找这样的工作:
df2['key1'] = df2['address'].map(lambda x: pctMatchLevenshtein(x, df1['address']) if pctMatchLevenshtein(x, df1['address'])>0.85 else 0)
非常感谢任何有关如何进行的提示。谢谢!
解决方案
推荐阅读
- java - 如何为 Android (java) 配置谷歌地图距离矩阵 API
- php - 如何根据要求使按钮可见和隐藏
- php - 发送图像数据时,Codeigniter POST 为空
- c# - 从使用 Selenium Webdriver 访问的 Web Combobox 填充 Combobox
- python - 从多个网站抓取/提取数据的最佳方式
- python - Numpy random.choice 概率总和不等于 1
- python - 如何使用 Python 请求登录网站?
- ruby-on-rails - 如何从 API 正确触发 Omniauth-Facebook (/auth/facebook)?
- php - 如何访问 PHP Laravel 集合的数据
- azure - Azure 应用程序 IP 在 spamhaus 中被列入黑名单