我有一个需要删除重复数据的名称和地址的数据帧。问题是,这些字段中的一些可能有错别字,即使它们仍然是重复的。例如,假设我有这个数据帧:
index name zipcode
------- ---------- ---------
0 john doe 12345
1 jane smith 54321
2 john dooe 12345
3 jane smtih 54321
拼写错误可能出现在name或zipcode中,但是让我们来考虑一下这个问题的名称one。显然,0和2与1和3是重复的。但是计算上最有效的方法是什么?在
我一直在使用Levenshtein距离来计算来自fuzzywuzzy package的两个字符串之间的距离,这在数据帧很小时非常有效,我可以通过以下方式迭代:
^{pr2}$显然,这不是一种能够很好地扩展的方法,不幸的是,我需要对一个大约7M行长的数据帧进行重复数据消除。显然,如果我还需要删除zipcode中潜在的输入错误,情况会变得更糟。是的,我可以用.itertuples()
来实现,这将使我的速度提高大约100倍,但是我是否遗漏了比这个笨重的O(n^2)
解决方案更明显的问题吗?在
有没有更有效的方法来消除这些嘈杂的数据?我已经研究过dedupe package,但是这需要有标签的数据来进行监督学习,我没有任何数据,我也没有印象到这个软件包可以处理无监督学习。我可以使用我自己的无监督文本聚类算法,但如果有一种现有的、更好的方法,我宁愿不用走那么远。在
对于zipcodes,我可以相当自信地说,如果没有某种字段验证机制,就无法检测出错误(两个zipcode看起来非常接近,而且都是有效的zipcode)
如果对数据进行了排序,并对排字的位置进行了一些假设(除了常见的替换情况外,第一个字母几乎不可能出现),那么您就可以利用这一点,并将它们按不同的字母块进行搜索。如果您假设姓氏相同,则可以将其分为26^2个不同的子组,并且只让他们在其字段中搜索。在
您也可以尝试一种方法,只查看原始的名字和姓氏。如果你要搜索700万个条目,你有6万个“john”,你只需将它们与“Jhon”进行一次比较就可以找到错误,然后搜索“Jhon”并删除或修复它。但这是假设,再一次,你把它分解成一个名字和姓氏序列在框架内(使用panda的str.提取物(),根据数据需要,使用“([\w]+)([\w]+)”或某些类似于您的regex的内容)
相关问题 更多 >
编程相关推荐