我试图删除熊猫数据框架中的一些观察结果,其中相似性几乎为100%,但不完全相同。见下面的框架:
注意“约翰”、“玛丽”和“卫斯理”有着几乎相同的观察结果,但有一列是不同的。真实数据集有15列和215000多个观测值。在我可以目测验证的所有案例中,相似性都是一样的:在15列中,另一列每次最多匹配14列。出于项目的目的,我决定删除重复的观察结果(并将它们存储到另一个数据框中,以防我的老板要求查看它们)
我显然想到过remove_duplicates(keep='something')
,但那是行不通的,因为观察结果并不完全相似。有没有人遇到过这样的问题?有什么补救办法吗
这可以表示为所有记录之间的成对汉明距离计算,将低于某个阈值的后续记录对分离出来。幸运的是,numpy/scipy/sklearn已经完成了这项繁重的工作。我包含了两个产生相同输出的函数——一个是完全矢量化的(但消耗O(N^2)内存),另一个是消耗O(N)内存但仅沿单个维度矢量化的。在您的范围内,几乎可以肯定不想要完全矢量化的版本-它可能会产生OOM错误。在这两种情况下,基本算法如下:
threshold
或低于汉明距离处发现两行,则丢弃后者,直到没有行保持低于该阈值代码:
现在让我们来测试一下。首先进行健全性检查:
我已经在多达40k行的数据帧(如下所示)上对此进行了测试,它似乎有效(这两种方法给出了相同的结果),但可能需要几秒钟的时间。我还没有按你的规模试过,但速度可能很慢:
如果您可以避免进行所有成对比较,例如按名称分组,那么将显著提高性能
乐趣旁白/方法问题
您可能会注意到,您可以获得有趣的“汉明链”(我不知道这是否是一个术语),其中非常不同的记录由一个编辑差异记录链连接:
如果有一个可以分组的字段(注释中提到
name
应该是相同的),那么性能将大大提高。这里两两计算在内存中为n^2。根据需要,可以用一些时间效率换取内存效率在列的子集上进行简单循环怎么样:
返回:
python库pandas-dedupe可以执行您想要的操作
看看这个答案: What is the most efficient way to dedupe a Pandas dataframe that has typos?
相关问题 更多 >
编程相关推荐