首页 > 解决方案 > 使用自定义函数合并两个 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)

非常感谢任何有关如何进行的提示。谢谢!

标签: pythondataframe

解决方案


推荐阅读