我正在做一个程序,在每个迭代中创建一些值(根本不是很多值:每次迭代只有~50个值,其中一些是短的4-5个字符串,但大多数是2-3个数字整数)。大约有3千次迭代。
现在,我使用pandas数据帧来存储给定迭代的~50个值,然后将df附加到数据帧列表(dflist),并且一旦完成所有3K迭代,我就连接3K数据帧(因为他们都有相同的列名称)使用类似的东西:
df_final = pd.concat(dflist,axis = 0)
有没有更好的方法来执行此过程,例如。只需使用一个numpy数组并沿轴0附加值,最后将完整的numpy数组转换为具有给定列名列的Pandas数据帧?
我问,因为经过多次迭代(3千次中约200次)后,代码大幅减慢,系统内存使用率逐渐增加,在迭代之间,据我所知,我的所有值都被覆盖了除了这个pandas数据帧列表之外的每次迭代,这似乎是每次迭代后唯一增长的事物。我使用的是Python 2.7。当我在Spyder GUI中运行脚本或仅从命令行运行脚本时会发生此行为。
另一件事:尽管我实际保存的值相对较小(每次迭代约50个值),但我提取的数据非常大。所以原来的csv大约是10 GB,行数约为2亿,我使用pd.read_csv将它与一个给定的chunksize(大约50K行)进行分块。然后对于那些50K行,我得到大约50个值。但是我会认为每个块都是独立的,因为值被覆盖的内存使用不应该像它一样增长。
示例df:
CHFAC Bygoper Change MinB NumB NumCombos Total
0 abc3 574936022 + 1 1 1 11
1 abc3 574936022 - 1 0 0 0
2 abc3 574936022 + 2 1 1 11
3 abc3 574936022 - 2 0 0 0
4 abc3 574936022 + 5 1 1 11
5 abc3 574936022 - 5 0 0 0
6 abc3 574936022 + 10 1 1 11
7 abc3 574936022 - 10 0 0 0
答案 0 :(得分:1)
您可以创造性地使用列表来存储数据,然后在循环结束时创建最终的数据帧。由于我们对您的创作过程一无所知,因此很难使用您的示例。我将给出一个通用答案,显示基于10次迭代的循环创建2列数据帧,其中每次迭代具有不同的输出长度
import pandas as pd
from random import randint
col1_val, col2_val = [], []
for i in range(10):
random_len = range(randint(0, 9))
col1 = random_len
col2 = random_len
col1_val.extend(col1)
col2_val.extend(col2)
pd.DataFrame({'col1':col1_val, 'col2':col2_val})
出[110]:
col1 col2
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 0 0
6 1 1
7 2 2
8 3 3
现在让我们看看速度,使用list方法:
import time
st = time.time()
col1_val, col2_val = [], []
for i in range(10000):
random_len = range(randint(0, 9))
col1 = random_len
col2 = random_len
col1_val.extend(col1)
col2_val.extend(col2)
pd.DataFrame({'col1':col1_val, 'col2':col2_val})
print time.time()-st
0.0499999523163
使用您的方法:
st = time.time()
dflist = []
for i in range(10000):
random_len = range(randint(0, 9))
col1 = random_len
col2 = random_len
dflist.append(pd.DataFrame({'col1':col1, 'col2':col2}))
pd.concat(dflist)
print time.time()-st
7.21199989319
因此,对于10000次迭代,它将快约180倍