Python 数据帧附加

Python 数据帧附加,python,pandas,dataframe,concat,Python,Pandas,Dataframe,Concat,我需要在每次迭代中向另一个(相同的结构)追加一个数据帧(50行),我有一个10000次迭代的循环,生成最终的数据帧大约需要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['

我需要在每次迭代中向另一个(相同的结构)追加一个数据帧(50行),我有一个10000次迭代的循环,生成最终的数据帧大约需要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)

还有别的办法吗

看起来连接操作并不是真正的瓶颈。我使用您的方法在大约22秒内连接了10000个数据帧,每个数据帧有50行。因此,除非发生了一些有趣的事情,或者您的数据帧非常宽(我只使用了1列),否则您最好的方法可能是分析您的代码(使用例如
pdb
)并查找真正消耗最多资源的部分(这应该是您遇到性能问题时的第一步)

但是,如果您确信连接会显著降低速度,则可以首先将所有
tmp
数据帧写入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秒

我不知道您是否将大部分时间花在
concat
函数上,但您可以尝试
out=out.append(tmp,ignore\u index=True)
我得到了与append相同的结果:(我有55列的数据帧!!好吧,在这种情况下,10分钟可能是现实的。你尝试过我建议的更改吗?应该至少让你的代码运行快五倍。
%timeit append2(10000)