Python Pandas创建了一长串数据帧以获得连接

时间:2016-10-21 17:03:30

标签: python pandas numpy append concatenation

我正在做一个程序,在每个迭代中创建一些值(根本不是很多值:每次迭代只有~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

1 个答案:

答案 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倍