【问题标题】:Using Pandas how do I deduplicate a file being read in chunks?使用 Pandas 如何对正在读取的文件进行重复数据删除?
【发布时间】:2015-08-19 11:04:49
【问题描述】:

我有一个固定宽度的大型文件以 10000 行的形式读入 pandas。除了从数据中删除重复项之外,这对所有事情都非常有用,因为重复项显然可以位于不同的块中。正在分块读取文件,因为它太大而无法全部放入内存中。

我对文件进行重复数据删除的第一次尝试是只引入对其进行重复数据删除所需的两列,并制作一个不读取的行列表。仅读取这两列(大约 500 列)很容易适应内存,我能够使用 id 列来查找重复项,并使用资格列来决定保留具有相同 id 的两列或三列中的哪一列。然后我使用 read_fwf() 命令的 skiprows 标志来跳过这些行。

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

那么,如何对正在分块处理的文件进行重复数据删除?

【问题讨论】:

    标签: python pandas chunking


    【解决方案1】:

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

    引入整个列以进行重复数据删除,在本例中为“id”。 然后创建不重复的行的位掩码。 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]
    

    这种方法只在这种情况下有效,因为数据很大,因为它很宽。它仍然需要完整地阅读一列才能工作。

    【讨论】:

    • 感谢您的精彩回答。我尝试了很多东西(排序、awk、dask)来从一个巨大的文件中删除重复项,但是每种方法都缺少一些东西,这会导致后来出现问题。我无法正确分析大文件,但在处理文件(具有唯一记录)时,似乎某些值正在另一列下移动。对于那些想要从有限内存中的大文件中删除重复项的人来说,这个答案是完美的答案。就我而言,我有 32 GB 的 RAM,我正在处理 6 GB 或更多的文件。
    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多