所以我将一个大数据框拆分为404个excel文件。数据框作为ID列,我必须:
例如,假设在文件#10和文件#209中包含键ID为“ ID_101”的行。脚本应输出“重复行:ID#101包含在文件#10和文件#209中”。
我尝试了这种方法:创建具有所有键ID的 set 和一个将每个ID映射到文件的 dictionary 。当我遍历文件及其行
所以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,这可能是因为它变得很大了。
如何使用如此大的数据框实现我的目的?
答案 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)
我无法尝试,因为我没有您的数据,也没有您确切的预期输出,但是类似的东西应该可以工作。