使用自定义函数合并两个Python数据帧以获得近似匹配和阈值分数

使用自定义函数合并两个Python数据帧以获得近似匹配和阈值分数,python,dataframe,Python,Dataframe,我有两个包含web地址和顶级域的数据帧。df1约有100万行,df2约有70万行。我需要合并这两个数据帧以获得公共web地址和相应的域以及每个数据帧特有的列。因为抄录网址和域可能会导致拼写错误,所以我需要使用近似合并 以下是一个例子: df1 df2 以下是我期望的输出: 输出 address tld test type 0 google .com 14100 1 1 stackoverflow

我有两个包含web地址和顶级域的数据帧。df1约有100万行,df2约有70万行。我需要合并这两个数据帧以获得公共web地址和相应的域以及每个数据帧特有的列。因为抄录网址和域可能会导致拼写错误,所以我需要使用近似合并

以下是一个例子:

df1

df2

以下是我期望的输出:

输出

      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_匹配查找近似匹配,然后合并,尝试了以下操作,但这并不是我想要做的

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)

任何关于如何进行的提示都将不胜感激。谢谢

这种方法需要计算所有成对距离,并可能导致1Mx700k=700B行。我想,要想找到一个切实可行的解决方案,需要对这个问题稍加放松。谢谢你的反馈。也许我可以根据tld或地址的第一个字母将数据帧分割成更小的块。例如,没有理由尝试将“google”与“stackoverflow”匹配。我可以创建更小的数据帧块,并尝试匹配这些数据帧(最糟糕的情况是,我会错过谷歌搜索)?这是一种可行的方法,但我怀疑google.com和google.ca应该被认为是相关的。也许比较基于字符的嵌入(可以预计算一次)更有效
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)