这是我先前发布的问题的一个变体,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)。
在我的计算机内存不足之前,有没有一种方法可以加快速度。
答案 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