大量记录之间的模糊匹配

时间:2016-06-24 19:58:51

标签: python pandas fuzzy-comparison

我有两个数据框。一个包含33765家公司。另外包含358839家公司。我想找到两者之间使用模糊匹配的匹配。由于记录数太多,我试图根据公司名称的第一个字母分解两个数据帧的记录。 例如:对于以字母" A"开头的所有公司,第一个数据框有2600个记录,第二个有25000个记录。我正在实现它们之间的完全合并,然后应用模糊匹配来使所有公司的模糊值超过95。 这仍然不起作用,因为记录数量仍然太高,无法执行它们之间的完全合并,然后实现模糊。每次我执行这些操作时内核都会死掉。当两个帧中的记录数为4位时,相同的方法工作正常。 另外,建议是否有办法让所有字母自动执行此操作' A'到' Z'而不是手动运行每个字母的代码(不会使内核死掉)。

这是我的代码:

c='A'
df1 = df1[df1.companyName.str[0] == c ].copy()
df2 = df2[df2.companyName.str[0] == c].copy()
df1['Join'] =1
df2['Join'] =1
df3 = pd.merge(df1,df2, left_on='Join',right_on='Join')
df3['Fuzz'] = df3.apply(lambda x: fuzz.ratio(x['companyName_x'], x['companyName_y']) , axis=1)
df3.sort_values(['companyName_x','Fuzz'],ascending=False, inplace=True)
df4 = df3.groupby('companyName_x',as_index=False).first()
df5=df4[df4.Fuzz>=95]

1 个答案:

答案 0 :(得分:0)

通过基于共享属性(第一个字母)分组记录,您开始走正确的道路。在记录连锁文献中,这个概念被称为blocking,它对于减少与易处理事物的比较次数至关重要。

前进的方向是找到更好的阻止规则:可能是前五个字符,或者是一个共同的整个单词。

dedupe library可以帮助您找到好的拦截规则。 (我是这个图书馆的核心开发者)