如何使用python记录链接工具包对大型数据集执行重复数据删除?

mspsb9vt  于 2023-01-22  发布在  Python
关注(0)|答案(1)|浏览(60)

我目前正在使用Python Record Linkage Toolkit对工作中的数据集执行重复数据删除,理想情况下,我只会使用blocking或sortedneighborhood来削减记录对索引的大小,但有时我需要对超过75 k条记录的数据集执行完整索引,这会导致数十亿条记录对。
我遇到的问题是,我可以使用的工作站内存不足,因此无法存储完整的25 - 30亿对multi-index. I know the documentation has ideas for doing record linkage with two large data sets using numpy split,这对于我的使用来说足够简单,但无法在单个 Dataframe 中提供任何重复数据删除功能。我实际上将此子集建议合并到了一个方法中,用于将multi-index拆分为子集并运行这些子集。但它没有解决.index()调用似乎将整个多索引加载到内存中并导致内存不足的问题。
有没有一种方法可以分割一个 Dataframe ,然后迭代地计算匹配的数据对,这样我就不必把整个工具包和数据库同时加载到内存中了?我一直在考虑dask,但是我对整个python还很绿色,所以我不知道如何把dask Dataframe 合并到记录链接工具包中。

ewm0tg9j

ewm0tg9j1#

虽然我能够解决这个问题,但我还是要留着它,因为我怀疑考虑到我对python的缺乏经验,我的过程还可以改进。
基本上,我不得不从记录链接工具包中抛弃索引函数。我拉出我正在使用的 Dataframe 的索引,然后将其转换为列表,并通过itertools组合函数传递它。

candidates = fl
candidates = candidates.index
candidates = candidates.tolist()
candidates = combinations(candidates,2)

这就给了我一个充满元组的迭代对象,而不必将所有内容都加载到内存中,然后我将它作为for循环传递给islice grouper。

for x in iter(lambda: list(islice(candidates,1000000)),[]):

然后,我在for循环中执行了所有必要的比较,并将得到的 Dataframe 添加到字典中,然后在完整列表的末尾将其连接起来,Python的内存使用一直没有超过3GB。
我仍然喜欢一些关于如何将dask融入其中的信息,所以我将接受任何可以提供这些信息的答案(除非mods认为我应该打开一个新问题)。

相关问题