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

时间:2020-10-17 21:34:26

标签: python pandas dataframe merge

这是我先前发布的问题的一个变体,Merging 1300 data frames into a single frame becomes really slow

这一次,我尝试将框架列明智地合并,而不是彼此合并。

我的目录中有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.read_csv(file_path,index_col=0) #this is the location of the first file


for filename in os.listdir(filepath): #filepath has the rest of the files
    file_path = os.path.join(filepath, filename)
    df = pd.read_csv(file_path,index_col=0)
    df = df.groupby(['Date']).first()
    df = df.add_prefix(f"{filename}-")
    frame = pd.merge(frame, df, how='outer', left_index=True, right_index=True)
    length-=1

但是在第300个文件附近,我的代码确实变慢了...

我正在逐列合并这些文件。

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

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

1 个答案:

答案 0 :(得分:2)

代码变慢的原因与linked question: quadratic copy中的问题相同。在每个循环中,您将复制 entire 现有数据框以及一些新数据。解决方案是将所有单个数据帧存储在一个列表中,然后在读取完所有文件后进行串联。

frame = []

for filename in os.listdir(filepath): #filepath has the rest of the files
    file_path = os.path.join(filepath, filename)
    df = (pd.read_csv(file_path, index_col=0)
          .groupby(['Date']).first()
          .add_prefix(f"{filename}-"))
    frame.append(df)

frame = pd.concat(frame, axis=1)

通过一些示例数据来说明这一概念:

df1 = pd.DataFrame(
    {'Date': ['2020-01-01', '2020-01-02', '2020-01-02', '2020-01-03'], 
     'A': [4, 5, 55, 6], 
     'B': [7, 8, 85, 9]}
).set_index('Date')
df2 = pd.DataFrame(
    {'Date': ['2020-01-02', '2020-01-03', '2020-01-04'], 
     'A': [40, 50, 60], 
     'C': [70, 80, 90]}
).set_index('Date')

frame = []

for n, df in enumerate([df1, df2]): #filepath has the rest of the files
    df = (df.groupby(level=['Date']).first()
          .add_prefix(f"{n}-"))
    frame.append(df)

frame = pd.concat(frame, axis=1)

>>> frame
            0-A  0-B   1-A   1-C
2020-01-01  4.0  7.0   NaN   NaN
2020-01-02  5.0  8.0  40.0  70.0
2020-01-03  6.0  9.0  50.0  80.0
2020-01-04  NaN  NaN  60.0  90.0

​