Pandas Dataframes附加

时间:2016-04-01 13:59:38

标签: python pandas dataframe concat

我需要在每次迭代时将DataFrame(50行)附加到另一个(相同的结构),我有一个10000次迭代的循环,生成最终的DataFrame大约需要10分钟。

out = pd.DataFrame()
tmp = res.copy()  #my initial DataFrame with 50 rows 

for nb in range(1,10001) :
    ...
    ...
    #some code here to
    match = (res.COL06 == 'PCE')
    tmp['COL06'] = np.where(match,res["CLE"].map(lambda x : x.ljust(12-len(str(nb)),'0')) + str(nb),res["COL06"]) 
    ...

    out = pd.concat([out,tmp],ignore_index='True',axis=0)

还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

看起来很像串联操作不是你真正的瓶颈。我使用您的方法在大约22秒内连接10,000个DataFrames,每行50行。所以,除非有一些有趣的事情发生,或者你的DataFrames非常广泛(我只使用了1列),你最好的镜头可能是对你的代码进行分析(使用例如pdb)并寻找真正消耗的部分。大多数资源(在遇到性能问题时应始终是您的第一步)。

但是,如果你肯定你的连接显着减慢了你的速度,你可以先将所有tmp DataFrames写入Python列表,然后在循环后立即连接所有这些:

import pandas as pd

def append1(n): # your method
    out = pd.DataFrame()
    for nb in range(n):
        tmp = pd.DataFrame({"val": range(nb,50+nb)})
        out = pd.concat([out,tmp],ignore_index='True',axis=0)
    return out

def append2(n): # concatenate after loop
    out = pd.DataFrame()
    tmp_list = []
    for nb in range(n):
        tmp = pd.DataFrame({"val": range(nb,50+nb)})
        tmp_list.append(tmp)
    out = pd.concat(tmp_list,ignore_index='True',axis=0)
    return out

绩效影响:

%timeit append1(10000)

1个循环,最佳3:每循环22.4秒

%timeit append2(10000)

1个循环,最佳3:每循环4.15秒