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