将循环中的 10000 个数据帧以 100 为一组连接到一个大数据帧并保存到 csv/txt-file
Concatenate 10000 dataframes from loop in groups of 100 to one big dataframe and save to csv/txt-file
我正在处理股票和如此大的数据框。我正在对 1000 个建筑物的 10000 个股票进行输入参数采样(因此,如果每个建筑物在 csv 文件中都是 1 行,则写入 csv 文件大约需要 10000000 行)。
为了执行此操作(不会在 Python 中出现 MemoryError)并为模拟程序准备文件,我需要将这些股票组合成更小的部分(而不是一个大文件),例如 100 支 1000 支的 100 支股票一个时间。知道怎么做吗?
我准备了一个小示例,其中我有一个原始数据框,我在其中覆盖了一个循环中的列。
最后,我将所有数据帧(在循环中生成)堆叠到一个大数据帧中(然后包含原始数据帧的 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,5,2,8,4,1],
"B": [10,12,24,8,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)
您可以在追加模式下打开一个文件,并将您的文件写入其中。
import pandas as pd
df = pd.read_csv("abalone.csv")
with open("output.csv", 'a') as outf:
df.to_csv(outf)
这样就可以一次读取一个文件,聚合保存到一个文件中。内存中一次只有一个文件。
如果您稍后只分析批次文件,我建议考虑在这一步保存到那些批次,然后您的文件更易于管理。
如果要写入的文件少于一千个,可以同时打开它们;获取数据后,将每一行写入相应的文件。
您需要将打开的文件保存在字典或类似的文件中,这样您就可以将每一行写入正确的文件,这样您就可以在最后将它们全部关闭。
类似于:
from contextlib import ExitStack
import pandas as pd
df_or = pd.DataFrame({"Case": [1,2,3,4,5,6],
"A": [3,5,2,8,4,1],
"B": [10,12,24,8,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
我正在处理股票和如此大的数据框。我正在对 1000 个建筑物的 10000 个股票进行输入参数采样(因此,如果每个建筑物在 csv 文件中都是 1 行,则写入 csv 文件大约需要 10000000 行)。 为了执行此操作(不会在 Python 中出现 MemoryError)并为模拟程序准备文件,我需要将这些股票组合成更小的部分(而不是一个大文件),例如 100 支 1000 支的 100 支股票一个时间。知道怎么做吗?
我准备了一个小示例,其中我有一个原始数据框,我在其中覆盖了一个循环中的列。 最后,我将所有数据帧(在循环中生成)堆叠到一个大数据帧中(然后包含原始数据帧的 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,5,2,8,4,1],
"B": [10,12,24,8,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)
您可以在追加模式下打开一个文件,并将您的文件写入其中。
import pandas as pd
df = pd.read_csv("abalone.csv")
with open("output.csv", 'a') as outf:
df.to_csv(outf)
这样就可以一次读取一个文件,聚合保存到一个文件中。内存中一次只有一个文件。
如果您稍后只分析批次文件,我建议考虑在这一步保存到那些批次,然后您的文件更易于管理。
如果要写入的文件少于一千个,可以同时打开它们;获取数据后,将每一行写入相应的文件。
您需要将打开的文件保存在字典或类似的文件中,这样您就可以将每一行写入正确的文件,这样您就可以在最后将它们全部关闭。
类似于:
from contextlib import ExitStack
import pandas as pd
df_or = pd.DataFrame({"Case": [1,2,3,4,5,6],
"A": [3,5,2,8,4,1],
"B": [10,12,24,8,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