【问题标题】:Fuzzy Match between large number of records大量记录之间的模糊匹配
【发布时间】:2017-04-15 10:12:48
【问题描述】:

我有两个数据框。一个包含 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]

【问题讨论】:

  • 为什么你的内核会死掉?你有多少内存,你的内存用完了吗?您能否在问题中包含df1.info(verbose=True, memory_usage=True)df1.info(verbose=True, memory_usage=True) 的输出?
  • 我不知道为什么,但这并没有显示任何输出。

标签: python pandas fuzzy-comparison


【解决方案1】:

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

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

dedupe library 可以帮助您找到好的屏蔽规则。 (我是这个库的核心开发者)

【讨论】:

    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多