2016-04-01 6 views
0

繰り返しごとにDataFrame(50行)を別の(同じ構造)に追加する必要があります。繰り返し回数10000のループがあり、最終的なDataFrameを生成するのに約10分かかります。Pandas Dataframes append

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

'concat'関数で時間を過ごすかどうか分かりませんが、' out = out.append(tmp、ignore_index = True) ' – cncggvg

+0

私はappendと同じ結果を得ました:( – slimoo

答えて

0

実際のボトルネックではありません。あなたのメソッドを使って、約22秒でそれぞれ50行の10,000データフレームを連結しました。面白いことが起こっていないかDataFramesが非常に広い(私はちょうど1列を使った)のでなければ、あなたのコードは(pdbなどを使って)プロファイリングし、本当に多くのリソースを消費する部分を探します。パフォーマンス上の問題にぶつかるときは、常にあなたの最初のステップになるはずです)。

あなたの連結が大幅にあなたを遅くしていることを肯定している場合は、あなたが最初のPythonのリストにtmpデータフレームの全てを書き込むことができ、ループの後に一度それらのすべてを連結:

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 sベスト:

+0

私は55列のデータフレームを持っています!! – slimoo

+0

申し訳ありませんが、この場合10分は現実的かもしれません。提案された変更を試しましたか?あなたのコードを少なくとも5倍速く走らせる必要があります。 – Dion

関連する問題