python - 将 1300 个数据帧合并为一个帧变得非常慢

标签 python pandas dataframe merge concatenation

我在一个目录中有 1300 个 csv 文件。
每个文件的第一列都有一个日期,然后是过去 20-30 年的每日数据,跨越另外 8 列。
所以像这样,
数据1.csv

Date source1 source2 source3 source4 source5 source6 source 7 source 8
我有 1300 个唯一命名的文件。
我正在尝试使用这样的 Pandas 将所有这些合并到一个数据帧中
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)

关于python - 将 1300 个数据帧合并为一个帧变得非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64388874/

相关文章:

python3 ValueError : shapes (4, 1) 和 (4,3) 未对齐 : 1 (dim 1) ! = 4 (dim 0)

python - 从几个 numpy 系列创建 Pandas 数据框

python - 如何处理来自 Python 中另一个类的小部件命令/函数调用?

python - 合并数据帧并仅保留不匹配的条目

python - 数据框中的 Pandas boolean 值比较

python - 使用 pandas 将数据框导出到 python 中的 csv 文件

python - Pandas,根据列值的唯一子集追加列

python-3.x - 如何获取用户输入并将其传递给预测模型

python - 如何避免 Python 3.7 中 f(x) = (1-cos(x))/x**2 中小数的灾难性取消?

python - 循环遍历 python 中的文件夹并打开文件会引发错误