使用 Pandas 如何对正在读取的文件进行重复数据删除?
Using Pandas how do I deduplicate a file being read in chunks?
我有一个固定宽度的大文件正在以 10000 行的块的形式读入 pandas。这对除了从数据中删除重复项之外的所有内容都非常有用,因为重复项显然可以位于不同的块中。正在分块读取文件,因为它太大而无法完全放入内存。
我对文件进行重复数据删除的第一次尝试是仅引入进行重复数据删除所需的两列,并列出不读取的行。仅读取这两列(大约 500 列)就可以轻松地存储在内存中,并且我能够使用 id 列查找重复项,并使用 eligibility 列来决定保留两个或三个具有相同 id 的列中的哪一个。然后我使用 read_fwf() 命令的 skiprows 标志跳过这些行。
我 运行 遇到的问题是 Pandas 固定宽度文件 reader 不能同时使用 skiprows = [list] 和 iterator = True。
那么,如何删除正在分块处理的文件的重复数据?
我的解决方案是只引入查找我想删除的重复项所需的列,并根据该信息制作位掩码。然后,通过了解块大小和我所在的块,我重新索引我所在的块,以便它匹配它在位掩码上表示的正确位置。然后我将它传递给位掩码并删除重复的行。
引入整个列进行重复数据删除,在本例中为 'id'。
然后创建一个不重复的行的位掩码。 DataFrame.duplicated()
returns 重复的行和 ~ 反转它。现在我们有了 'dupemask'.
dupemask = ~df.duplicated(subset = ['id'])
然后创建一个迭代器以将文件分块放入。一旦完成,遍历迭代器并为每个块创建一个新索引。这个新索引将小块数据帧与其在 'dupemask' 位掩码中的位置相匹配,然后我们可以使用它来仅保留不重复的行。
for i, df in enumerate(chunked_data_iterator):
df.index = range(i*chunksize, i*chunksize + len(df.index))
df = df[dupemask]
这种方法只适用于这种情况,因为数据很大,因为它太宽了。它仍然需要完整地阅读一个专栏才能工作。
我有一个固定宽度的大文件正在以 10000 行的块的形式读入 pandas。这对除了从数据中删除重复项之外的所有内容都非常有用,因为重复项显然可以位于不同的块中。正在分块读取文件,因为它太大而无法完全放入内存。
我对文件进行重复数据删除的第一次尝试是仅引入进行重复数据删除所需的两列,并列出不读取的行。仅读取这两列(大约 500 列)就可以轻松地存储在内存中,并且我能够使用 id 列查找重复项,并使用 eligibility 列来决定保留两个或三个具有相同 id 的列中的哪一个。然后我使用 read_fwf() 命令的 skiprows 标志跳过这些行。
我 运行 遇到的问题是 Pandas 固定宽度文件 reader 不能同时使用 skiprows = [list] 和 iterator = True。
那么,如何删除正在分块处理的文件的重复数据?
我的解决方案是只引入查找我想删除的重复项所需的列,并根据该信息制作位掩码。然后,通过了解块大小和我所在的块,我重新索引我所在的块,以便它匹配它在位掩码上表示的正确位置。然后我将它传递给位掩码并删除重复的行。
引入整个列进行重复数据删除,在本例中为 'id'。 然后创建一个不重复的行的位掩码。 DataFrame.duplicated() returns 重复的行和 ~ 反转它。现在我们有了 'dupemask'.
dupemask = ~df.duplicated(subset = ['id'])
然后创建一个迭代器以将文件分块放入。一旦完成,遍历迭代器并为每个块创建一个新索引。这个新索引将小块数据帧与其在 'dupemask' 位掩码中的位置相匹配,然后我们可以使用它来仅保留不重复的行。
for i, df in enumerate(chunked_data_iterator):
df.index = range(i*chunksize, i*chunksize + len(df.index))
df = df[dupemask]
这种方法只适用于这种情况,因为数据很大,因为它太宽了。它仍然需要完整地阅读一个专栏才能工作。