将循环中的10000个数据帧以100个为一组连接到一个大数据帧,然后保存到csv / txt文件

问题描述

我正在处理库存和大型数据框。我正在为1000幢建筑物的10000股股票进行输入参数采样(因此,如果每座建筑物在csv文件中为1行,则写入csv文件大约为10000000行)。 为了执行此操作(不使用Python获取MemoryError)并准备用于模拟程序的文件,我将需要将这些库存分组为较小的部分(而不是一个文件),例如一次100个库存,每1000个库存。知道怎么做吗?

我准备了一个小示例,其中有一个原始数据帧,其中覆盖了循环中的一列。 最后,我将所有(在循环中生成的)数据帧堆叠到一个大数据帧(该数据帧包含原始数据帧的x倍,并在此进行更改),而不是将所有内容堆叠到一个大df中并将其保存到csv中,一次堆叠100只股票。

现在,我将所有股票堆叠在一个大的df中,然后将其分成带有额外“ ID”列的碎片。在此过程中是否有办法做到这一点(假设我总共需要1000或100000只股票)?计算并堆叠100只股票->将它们保存到csv->计算并堆叠接下来的100只股票->将它们保存到csv ...

尝试的代码

import pandas as pd

df_or = pd.DataFrame({"Case": [1,2,3,4,5,6],"A": [3,8,1],"B": [10,12,24,57,84]})

print(df_or)

total = []

for i in range(0,1000):
    df = df_or.copy()
    df.loc[:,'A'] = df_or.loc[:,'A'].mul(i)   
    df.loc[:,'ID'] = df.loc[:,'Case'] + i*100000
    print(df)

    total.append(df)

total = pd.concat(total)
total = total.sort_values('ID')

for i in range(0,10):

    stocks = total[((i) * 100 * 100000 <= total['ID']) & (total['ID'] <= (i + 1) * 100 * 100000)]

    stocks.to_csv('stack100_' + str(i) + '.csv',sep=',',index=False)


解决方法

如果要写入的文件少于一千个,则可以同时打开它们;在获取数据时,将每一行写入相应的文件。

您需要将打开的文件保存在词典中或类似文件中,以便可以将每一行写到正确的文件中,以便最后将其全部关闭。

类似的东西:

from contextlib import ExitStack
import pandas as pd

df_or = pd.DataFrame({"Case": [1,2,3,4,5,6],"A": [3,8,1],"B": [10,12,24,57,84]})

with ExitStack() as stack:

    files = [
        stack.enter_context(open('stack100_' + str(j) + '.csv','w'))
        for j in range(0,10)
    ]

    for i in range(0,1000):
        df = df_or.copy()
        df.loc[:,'A'] = df_or.loc[:,'A'].mul(i)
        df.loc[:,'ID'] = df.loc[:,'Case'] + i*100000

        for j in range(0,10):
            stocks = df[(
                (j) * 100 * 100000
                <= total['ID']) & (total['ID']
                <= (j + 1) * 100 * 100000
            )]
            stocks.to_csv(files[j],sep=',',index=False)

        del stocks,df
,

您可以以追加模式打开文件,然后将文件写入其中。

import pandas as pd

df = pd.read_csv("abalone.csv")

with open("output.csv",'a') as outf:
    df.to_csv(outf)

通过这种方式,您可以一次读取每个文件,进行汇总并保存到文件中。一次仅一个文件在内存中。

如果您以后仅要分批分析文件,建议您在此步骤中考虑将其保存到这些批文件中,这样您的文件将更易于管理。