微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将1300个数据帧合并为单个帧变得非常缓慢

如何解决将1300个数据帧合并为单个帧变得非常缓慢

我的目录中有1300个csv文件

每个文件的第一列都有一个日期,然后是最近20到30年的每日数据,涵盖了另外8列。

这样, Data1.csv

Date source1 source2 source3 source4 source5 source6 source 7 source 8

我有1300个唯一命名的文件

我正在尝试使用像这样的熊猫将所有这些合并到一个数据帧中

import pandas as pd 
frame = pd.DataFrame()

length = len(os.listdir(filepath))
for filename in os.listdir(filepath):
    file_path = os.path.join(filepath,filename)
    print(length,end=" ")
    df = pd.read_csv(file_path,index_col=0)
    df = pd.concat([df[[col]].assign(Source=f'{filename[:-4]}-{col}').rename(columns={col: 'Data'}) for col in df])
    frame = frame.append(df)
    length-=1

但是在第300个文件中,我大约有1200万行,并且我的代码确实变慢了……

在我的计算机内存不足之前,有没有一种方法可以加快速度。

我的目标实际上是拥有一个庞大的数据框,按30年的日期数计算,其值为1+(1300x8)。

解决方法

循环变慢的原因是因为每个.append()数据帧必须创建一个副本才能分配更多的内存,如here所述。

如果您的内存可以容纳所有内容,则可以先用所有数据帧填充固定大小(1300)的列表,然后使用df = pd.concat(list_of_dataframes),这可能会避免此问题你现在有。您的代码可以这样调整:

import pandas as pd 
lst = [None for _ in range(1300)] # Creates empty list

for i,filename in enumerate(os.listdir(filepath)):
    file_path = os.path.join(filepath,filename)
    df = pd.read_csv(file_path,index_col=0)
    df = pd.concat([df[[col]].assign(Source=f'{filename[:-4]}-{col}').rename(columns={col: 'Data'}) for col in df])
    lst[i] = df
    

frame = pd.concat(lst)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。