2016-10-21 4 views
1

私はいくつかの値が各反復で作成されるプロシージャを実行しています(値はあまりありません。反復ごとに〜50個の値しかありません。文字列ですが、大部分は2〜3桁の整数です)。約3000回の反復があります。Python Pandasは連結するデータフレームの長いリストを作成します

今、私はパンダのデータフレームを使用して、それらの〜50の値を所定の反復で保存し、次にdfをデータフレームのリスト(dflist)に追加し、3Kの反復がすべて完了したら、3Kデータフレームを連結します彼らはすべてのようなものを使用して)同じ列名を持っているので:

df_final = pd.concat(dflist、軸= 0)

は例えば、この手順を行うには良い方法はあります。 numpyの配列を使用し、軸0に沿って値を追加し、最後に完全なnumpy配列を与えられた列名でPandasデータフレームに変換しますか?

多くの繰り返し(〜200のうち〜200)の後、コードが大幅に減速し、システムメモリの使用がゆっくりと這い上がり、反復の間に、私のすべての値が各繰り返しの後に成長する唯一のものと思われるこのパンダのデータフレームのリストを除き、各繰り返しに上書きされます。私はPython 2.7を使用しています。この動作は、Spyder GUIでスクリプトを実行した場合、またはコマンドラインからスクリプトを実行した場合に発生します。

他のもの:私が実際に保存する値は比較的小さい(反復ごとに50個の値)が、それらの要約値を抽出するためのデータは非常に大きいです。元のcsvは〜10 GBで〜200millionの行があり、私はそれを約50K行である与えられたchunkksizeでpd.read_csvを使ってチャンクします。そして、50Kの線については、私は約50の値を得ます。しかし、私は、それぞれのチャンクは独立していると思っていたでしょう。

例DF:

CHFAC Bygoper Change MinB NumB NumCombos Total 
0 abc3 574936022 + 1  1 1 11 
1 abc3 574936022 - 1  0 0 0 
2 abc3 574936022 + 2  1 1 11 
3 abc3 574936022 - 2  0 0 0 
4 abc3 574936022 + 5  1 1 11 
5 abc3 574936022 - 5  0 0 0 
6 abc3 574936022 + 10 1 1 11 
7 abc3 574936022 - 10 0 0 0 
+0

あなたが連結しているサンプルを1つまたは2つ表示すると、あなたのポストに基づいてインデックス数やインデックスなどがわかりにくいです。 –

答えて

0

あなたは創造的であるとあなたのデータを格納し、ループの最後で、最終的なデータフレームを作成するために、リストを使用することができます。私たちはあなたの作成プロセスを知らないので、あなたの例を使用するのは難しいです。

col1 col2 
0  0  0 
1  1  1 
2  2  2 
3  3  3 
4  4  4 
5  0  0 
6  1  1 
7  2  2 
8  3  3 

今してみましょう:私は、各反復は、出力の異なるな長さを持っている10回の反復

import pandas as pd 
from random import randint 
col1_val, col2_val = [], [] 
for i in range(10): 
    random_len = range(randint(0, 9)) 
    col1 = random_len 
    col2 = random_len 
    col1_val.extend(col1) 
    col2_val.extend(col2) 
pd.DataFrame({'col1':col1_val, 'col2':col2_val}) 

アウト[110]のループに基づいて、2列のデータフレームの作成を示す一般的な答えを与えます

st = time.time() 
dflist = [] 
for i in range(10000): 
    random_len = range(randint(0, 9)) 
    col1 = random_len 
    col2 = random_len 
    dflist.append(pd.DataFrame({'col1':col1, 'col2':col2})) 
pd.concat(dflist) 
print time.time()-st 
7.21199989319 
:あなたの方法を使用して

import time 
st = time.time() 
col1_val, col2_val = [], [] 
for i in range(10000): 
    random_len = range(randint(0, 9)) 
    col1 = random_len 
    col2 = random_len 
    col1_val.extend(col1) 
    col2_val.extend(col2) 
pd.DataFrame({'col1':col1_val, 'col2':col2_val}) 
print time.time()-st 
0.0499999523163 

:listメソッドを使用して、スピードを見て

このように10000回の反復では、約180倍速くなります。

+0

これは、データフレームのリストに追加する現在の方法よりも改善すべきです。だから、あなたの提案したカラム拡張メソッドのパフォーマンスの違いは何ですか?col1_val.extend(col1)対すべての値をnumpy配列に一度に追加するのですか?例えば。 vals = np.vstack((vals、[1,2]))2列の例では? – sambajetson

+0

@sambajetson numpy配列を拡張したり追加したりするのはメモリ効率があまり良くないので、推奨しません。あなたはそのようにアプローチしてはならない理由の例として、[この回答を読む](http://stackoverflow.com/questions/13215525/how-to-extend-an-array-in-place-in-numpy)をすることができます –

関連する問題