查找重复的行以及包含在大数据框中的重复行的文件,该文件分为多个文件

时间:2019-04-19 09:10:34

标签: python pandas dataframe bigdata

所以我将一个大数据框拆分为404个excel文件。数据框作为ID列,我必须:

  1. 查找是否存在重复的行
  2. 如果有重复的行,则输出包含重复行的两个文件

例如,假设在文件#10和文件#209中包含键ID为“ ID_101”的行。脚本应输出“重复行:ID#101包含在文件#10和文件#209中”。

我尝试了这种方法:创建具有所有键ID的 set 和一个将每个ID映射到文件的 dictionary 。当我遍历文件及其行

  1. 如果ID位于集合中,它将查找字典并输出已找到该行的位置。
  2. 如果ID不在集合中,则会将其添加到集合中,并在字典中创建一个新条目,将该ID映射到当前文件

所以MWE为:

import os, sys, pandas

ids_set = set()
ids_map = dict()

for root, dirs, files in os.walk(sys.argv[1]):
    for file in files:
        in_file = pandas.read_excel(os.path.join(root, file), header=0, sheet_name="Results")    

        # Check for duplicated companies
        this_ids = list(in_file['BvD ID number'])
        for this_id in this_ids:
            if this_id in ids_set:
                print("ERROR: duplicate ID '{}', already found in '{}'".format(this_id, ids_map[this_id]))
            else:
                ids_set.add(this_id)
                ids_map[this_id] = filen

问题在于,在第300个内容文件中,当我尝试访问该字典时出现了MemoryError,这可能是因为它变得很大了。

如何使用如此大的数据框实现我的目的?

1 个答案:

答案 0 :(得分:0)

之所以会出现内存错误,是因为您在Pandas针对矢量化操作进行了优化的同时以递归方式进行此操作。

最好的方法是将所有数据框附加到一个很大的数据框中,创建一个包含源文件的列,并查找重复项。

类似的东西:

.arrow

然后获取重复的行:

df = pandas.DataFrame()

for root, dirs, files in os.walk(sys.argv[1]):
    for file in files:
        current_df = pandas.read_excel(filen, header=0, sheet_name="Results")
        current_df["source_file"] = root + file

        df = df.append(current_file, ignore_index=True)

我无法尝试,因为我没有您的数据,也没有您确切的预期输出,但是类似的东西应该可以工作。