对于有输入错误的Pandas数据帧,重复数据的最有效方法是什么?

2024-05-13 19:08:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个需要删除重复数据的名称和地址的数据帧。问题是,这些字段中的一些可能有错别字,即使它们仍然是重复的。例如,假设我有这个数据帧:

  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,但是这需要有标签的数据来进行监督学习,我没有任何数据,我也没有印象到这个软件包可以处理无监督学习。我可以使用我自己的无监督文本聚类算法,但如果有一种现有的、更好的方法,我宁愿不用走那么远。在


Tags: 数据方法name名称距离packageindex地址
1条回答
网友
1楼 · 发布于 2024-05-13 19:08:43

对于zipcodes,我可以相当自信地说,如果没有某种字段验证机制,就无法检测出错误(两个zipcode看起来非常接近,而且都是有效的zipcode)

如果对数据进行了排序,并对排字的位置进行了一些假设(除了常见的替换情况外,第一个字母几乎不可能出现),那么您就可以利用这一点,并将它们按不同的字母块进行搜索。如果您假设姓氏相同,则可以将其分为26^2个不同的子组,并且只让他们在其字段中搜索。在

您也可以尝试一种方法,只查看原始的名字和姓氏。如果你要搜索700万个条目,你有6万个“john”,你只需将它们与“Jhon”进行一次比较就可以找到错误,然后搜索“Jhon”并删除或修复它。但这是假设,再一次,你把它分解成一个名字和姓氏序列在框架内(使用panda的str.提取物(),根据数据需要,使用“([\w]+)([\w]+)”或某些类似于您的regex的内容)

相关问题 更多 >