2013-06-19 6 views
10

約1000〜2000個のCSVファイルのセットに対してouterマージを実行するためにパンダを使用しています。各CSVファイルには、すべてのCSVファイル間で共有される識別子列idがありますが、各ファイルには3〜5列の固有の列があります。各ファイルには約2万の一意のid行があります。私がしたいのは、これらをまとめて、すべての新しい列をまとめて、マージインデックスとしてid列を使用することだけです。Pythonのパンダと大規模にマージするMemoryError

私はそれが簡単なmerge呼び出しを使用して行います。

merged_df = first_df # first csv file dataframe 
for next_filename in filenames: 
    # load up the next df 
    # ... 
    merged_df = merged_df.merge(next_df, on=["id"], how="outer") 

問題はほぼ2000 CSVファイルで、私はパンダによってスローmerge操作でMemoryErrorを得るということです。私はこれがマージ操作の問題のために制限されている場合はわからないのですか?

最終的なデータフレームの行数は20,000で、おおよそ(2000 x 3)= 6000です。これは大きいですが、20 GBを超えるRAMを使用しているコンピュータのすべてのメモリを消費するのに十分な大きさではありません。このサイズはパンダの操作には大きすぎますか?代わりにsqliteのようなものを使うべきですか?このスケールで動作させるために、merge操作で変更できるものはありますか?

ありがとうございました。

答えて

7

は、私はあなたがconcat(外側のような役割を果たし参加)を使用して、より良いパフォーマンスを得るだろうと思う:

dfs = (pd.read_csv(filename).set_index('id') for filename in filenames) 
merged_df = pd.concat(dfs, axis=1) 

これは、あなたが唯一のマージ操作ではなく、各ファイルのいずれかを行っていることを意味します。

+1

を無視されている場合、あなたは代わりの世代の表現を使用することができるはずですしながら、しかし、1は、この機能が参加しないように注意する必要があるのではなく、水平アペンドリストの理解...(concatの内部動作についてはわかりません) – root

+0

@rootよく、ジェネレータはもっと良いと思います(最悪の場合はリストに変換します):) –

+0

@root良い点btw ! (tbh私はコンカットがジェネレータを受け入れることを知らなかった!) –

0

1GBファイルのread_csvを使用して32ビットのpytwhenで同じエラーが発生しました。 64ビットバージョンを試してみてうまくいけば、メモリエラーの問題を解決します。

0

pd.concatは大きなデータフレームでもメモリが不足しているようですが、dfsを行列に変換して連結します。

def concat_df_by_np(df1,df2): 
    """ 
    accepts two dataframes, converts each to a matrix, concats them horizontally and 
    uses the index of the first dataframe. This is not a concat by index but simply by 
    position, therefore the index of both dataframes should be the same 
    """ 
    dfout = deepcopy(pd.DataFrame(np.concatenate((df1.as_matrix(),df2.as_matrix()),axis=1), 
            index = df1.index, 
            columns = np.concatenate([df1.columns,df2.columns]))) 
    if (df1.index!=df2.index).any(): 
     #logging.warning('Indices in concat_df_by_np are not the same')      
     print ('Indices in concat_df_by_np are not the same')      


    return dfout 

インデックスは、メモリのとおり

関連する問題