Gre*_*ius 5 python chunking pandas
我有一个大的固定宽度文件,被以10000行的块读取到熊猫中。除了从数据中删除重复项之外,这对所有其他事情都非常有用,因为重复项显然可以位于不同的块中。正在分块读取文件,因为它太大而无法完全放入内存中。
我对文件进行重复数据删除的第一个尝试是仅引入两行以进行重复数据删除,并列出了不可读的行。仅读取这两列(大约500列)就很容易适合内存,并且我能够使用id列查找重复项,并使用eligibility列来确定要保留两个或三个具有相同id的哪个。然后,我使用read_fwf()命令的skiprows标志跳过这些行。
我遇到的问题是Pandas等宽文件阅读器无法同时与skiprows = [list]和iterator = True一起使用。
那么,如何对正在处理的文件进行重复数据删除?
我的解决方案是仅引入查找我想要删除的重复项所需的列,并根据该信息创建位掩码。然后,通过了解块大小和我所在的块,我重新索引我所在的块,以便它与它在位掩码上表示的正确位置匹配。然后我只需将其传递给位掩码,重复的行就会被删除。
引入要进行重复数据删除的整个列,在本例中为“id”。然后创建不重复的行的位掩码。DataFrame.duplicate() 返回重复的行,并且 ~ 反转它。现在我们有了“dupmask”。
dupemask = ~df.duplicated(subset = ['id'])
Run Code Online (Sandbox Code Playgroud)
然后创建一个迭代器以将文件分成块。完成后循环迭代器并为每个块创建一个新索引。这个新索引将小块数据帧与其在“dupemask”位掩码中的位置相匹配,然后我们可以使用它来仅保留不重复的行。
for i, df in enumerate(chunked_data_iterator):
df.index = range(i*chunksize, i*chunksize + len(df.index))
df = df[dupemask]
Run Code Online (Sandbox Code Playgroud)
这种方法仅在这种情况下有效,因为数据很大,因为它太宽了。它仍然需要完整地阅读一个专栏才能工作。