2013-06-18 2 views
16

私はPandasライブラリを使用してリモートセンシング時系列解析を行っています。最終的には、チャンクサイズを使用してDataFrameをcsvに保存したいのですが、少し問題があります。私のコードは、私がPandas Seriesに変換する6個のNumPy配列を生成します。これらのシリーズのそれぞれは、私はパンダDataFram(DF)にシリーズを追加したい項目パンダを使用してSeriesでDataFrameを作成すると、メモリエラーが発生する

>>> prcpSeries.shape 
(12626172,) 

の多くが含まれているので、私は、CSVファイルにチャンクによって彼らにチャンクを保存することができます。

d = {'prcp': pd.Series(prcpSeries), 
    'tmax': pd.Series(tmaxSeries), 
    'tmin': pd.Series(tminSeries), 
    'ndvi': pd.Series(ndviSeries), 
    'lstm': pd.Series(lstmSeries), 
    'evtm': pd.Series(evtmSeries)} 

df = pd.DataFrame(d) 
outFile ='F:/data/output/run1/_'+str(i)+'.out' 
df.to_csv(outFile, header = False, chunksize = 1000) 
d = None 
df = None 

しかし、私のコードは、メモリエラー

df = pd.DataFrame(d) 

任意の提案を与え、次の行で動けなくなりますか?チャンスでパンダのDataFrameチャンクを埋めることは可能ですか?

+1

あなたは、単一の列からのデータフレームを作ることができ、ここでの代替は、データフレームとしてそれぞれを作成し、外側(concatを使用)の参加を実行することです({'tmax':pd.Series(tmaxSeries)})? –

+0

はい、それは – Mattijn

+1

最初のシリーズでフレームを作成し、連続して追加します。 '' df = DataFrame({'prcp':pd.Series(prcpSeries)}); df ['tmax'] = pd.Series(tmaxSeries) ''。あなたはおそらくそれをHDF5に書かなければなりません。http://pandas.pydata.org/pandas-docs/dev/io.html#hdf5-pytables – Jeff

答えて

17

あなたが知っている場合、これらのそれぞれが同じ長さ、あなたは、アレイから直接データフレームを作成し、各列を追加することができます:

df = pd.DataFrame(prcpSeries, columns=['prcp']) 
df['tmax'] = tmaxSeries 
... 

注:あなたも(to_frameメソッドを使用することができますこれはあなたが(オプション)名を渡すことができます - シリーズは1を持っていない場合に便利です):

df = prcpSeries.to_frame(name='prcp') 

しかし、それらが可変長である場合、これはいくつかのデータを失います(prcpSeriesより長い配列)。例えば

df1 = pd.DataFrame(prcpSeries, columns=['prcp']) 
df2 = pd.DataFrame(tmaxSeries, columns=['tmax']) 
... 

df = pd.concat([df1, df2, ...], join='outer', axis=1) 

:pd.DataFrane:

In [21]: dfA = pd.DataFrame([1,2], columns=['A']) 

In [22]: dfB = pd.DataFrame([1], columns=['B']) 

In [23]: pd.concat([dfA, dfB], join='outer', axis=1) 
Out[23]: 
    A B 
0 1 1 
1 2 NaN 
+0

おかげでアンディとジェフ!私は第2のアプローチがdf = pd.concat(など)の行でメモリエラーを取得するので、各カラムを追加する最初の方法を使用しました。私は最長の長さのシリーズを知っていて、それを使ってDataFrameを初期化します。 – Mattijn

+0

注意点:私はpandasバージョン0.14.1を使用しています。シリーズオブジェクトをDataFrameオブジェクトに強制変換しようとすると、 'pandas.DataFrame()'コールで 'columns = ['my_column_name']'を指定すると、結果のオブジェクトは空のDataFrameです。 columns引数を削除したとき、結果のDataFrameは期待どおりでした。 – Jubbles

+0

@Jubblesこれについて言及してくれてありがとうございます。おそらく、ここで 'to_frame'メソッドを使用する方がきれいです(元の回答を書いたときにこれが利用可能であるかどうかはわかりません)。私はこれはもはや0.14 +で動作しないかどうかを見るために見ていきます、私は後で確認する必要があります。 –

関連する問題