我需要在每次迭代时将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)
还有其他办法吗?
答案 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秒