使用Pandas如何对以块状态读取的文件进行重复数据删除?

时间:2015-06-04 17:38:44

标签: python pandas chunking

我有一个大的固定宽度文件,以10000行的块读入pandas。这对于除了从数据中删除重复项之外的所有内容都很有效,因为重复项显然可以在不同的块中。该文件正在以块的形式读取,因为它太大而无法完全适合内存。

我首次尝试对文件进行重复数据删除是为了引入重复数据删除所需的两列,并使行列表无法读取。读取这两列(大约500列)很容易适应内存,我可以使用id列查找重复项和资格列来决定哪两个或哪三个具有相同的id。然后我使用read_fwf()命令的skiprows标志跳过这些行。

我遇到的问题是Pandas固定宽度文件阅读器不能同时使用skiprows = [list]和iterator = True。

那么,如何重复删除正在处理的文件?

1 个答案:

答案 0 :(得分:0)

我的解决方案是引入查找我想要删除的重复项所需的列,并根据该信息创建一个位掩码。然后,通过了解chunksize以及我在哪个块上重新索引我的块,以便它匹配它在位掩码上表示的正确位置。然后我只是通过位掩码传递它,并删除重复的行。

在整个列中进行重复数据删除,在这种情况下为“id”#。 然后创建AREN' T复制的行的位掩码。 DataFrame.duplicated() 返回重复的行,然后〜反转它。现在我们有了#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]

这种方法仅适用于这种情况,因为数据很大,因为它太宽了。为了工作,它仍然必须完整地阅读一列。