我试图迭代地添加一些我从一组csv文件中读取的pandas数据帧,并且在第16个文件之后,我得到了内存错误。新文件是大约300k行的熊猫。
有没有办法在硬盘驱动器中(例如使用hdf5)或以更高效的内存方式执行此操作?
见下面的代码。请注意,sum_of_all_files从空数据帧开始。
sum_of_all_files = pd.DataFrame()
for file_name in list_of_files:
file_df=pd.read_csv(file_name,index_col=0,header=None).dropna()
sum_of_all_files=sum_of_all_files.add(file_df,fill_value=0, axis='index')
谢谢!
编辑:我想按索引添加,即如果两行具有相同的索引,则添加它们。我通过在最后一行添加“axis ='index'”来纠正上面的代码。
答案 0 :(得分:1)
files = glob.glob('files/*.csv')
dfs = [pd.read_csv(file_name,index_col=0,header=None).dropna() for file_name in files]
df = pd.concat(dfs).sum()
print (df)
答案 1 :(得分:1)
更新:我只需将所有CSV以块的形式添加到您的解决方案中。我认为你在节省内存方面已经做得很好......
sum_of_all_files = pd.DataFrame()
for file_name in list_of_files:
for file_df in pd.read_csv(file_name, index_col=0, header=None, chunksize=10**5)
sum_of_all_files = sum_of_all_files.add(file_df.dropna(), fill_value=0, axis='index')
OLD回答:
想法:我们会将第一个文件读入total
DF,然后我们将从list_of_files
中的第二个文件开始,在每个迭代步骤中读取一个文件并添加飞到total
DF
如果有大量文件不适合内存,你可以进一步阅读每个CSV文件:
total = pd.read_csv(list_of_files[0], index_col=0, header=None).dropna()
for f in list_of_files[1:]:
for chunk in pd.read_csv(f,index_col=0,header=None, chunksize=10**5):
total = total.add(chunk.dropna(), fill_value=0, axis='index')