以内存有效的方式迭代添加pandas数据帧

时间:2016-07-29 11:28:46

标签: python pandas memory-management dataframe

我试图迭代地添加一些我从一组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'”来纠正上面的代码。

2 个答案:

答案 0 :(得分:1)

您可以concat使用sum

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')