2016-08-24 9 views
1

2つのデータフレームをマージしています。元々は.csvのファイルで、それぞれ7メガバイト(2列と290,000行)しかありません。私はこのようにマージしています:値エラー:マージ時に負の次元は使用できません

merge=pd.merge(df1,df2, on=['POINTID'], how='outer') 

と32ビットのアナコンダに私が取得:

ValueError: negative dimensions are not allowed

が、64ビットのアナコンダに私はメモリエラーを取得します。

私は12ギガバイトのRAMを持っており、その30%しか使用されていないので、メモリの問題ではありません。私は別のコンピュータで試して同じ問題を抱えています。

+0

あなたはそれを試すことができますサンプル? ''外側 ''で '' POINTID ''、 '= 'POINTID' ')の' 'df1 [:100]、df2 [:100] – ayhan

+0

は動作しますが、これよりも大きなファイルを一緒に結合しても問題はありませんでした。 –

+0

結果は期待通りですか?マージしているときに、多くのNaNを導入する整列の問題が生じることがあります。だから私はそれが記憶上の問題かもしれないと言いました。 – ayhan

答えて

5

32ビットマシンでは、デフォルトのNumPy整数dtypeはint32です。 64ビットマシンでは、デフォルトのNumPy整数dtypeはint64です。

int32int64で表現最大整数である。

In [88]: np.iinfo('int32').max 
Out[88]: 2147483647 

In [87]: np.iinfo('int64').max 
Out[87]: 9223372036854775807 

だからpd.mergeによって作成された整数インデックスが64で32ビットマシン上2147483647 = 2**31-1行、及び9223372036854775807 = 2**63-1行の最大をサポートしますビットマシン。

理論では、outerとマージされた2つの290000行のデータフレームには、290000**2 = 84100000000行のデータが含まれています。

In [89]: 290000**2 > np.iinfo('int32').max 
Out[89]: True 

32ビットマシンでは、マージされた結果をインデックスするのに十分な大きさの整数インデックスを生成できないことがあります。

64ビットマシンでは、理論上は結果を収めるのに十分な大きさの整数インデックスを生成できますが、840億行のDataFrameを構築するのに十分なメモリがない可能性があります。

もちろん、マージされたDataFrameには840億行未満があります(正確な数値は、df1['POINTID']df2['POINTID']に表示される重複値の数によって異なります)。しかし、上記のエンベロープ計算では、多くの重複を持つことと一致しています。


PS。算術オーバーフローがある場合numpyのアレイに正の整数を追加したり掛けるときは、負の値を取得することができます:

In [92]: np.int32(290000)*np.int32(290000) 
Out[92]: -1799345920 

私の推測では、これは例外の理由であるということである。

ValueError: negative dimensions are not allowed 
+0

私はそれを設定したので、それぞれ1486970行のデータフレームを2つ持ち、 'left'マージを使用して同じメモリエラーが発生します。 –

+0

' 1486970> 290000'、 'left'マージン'N ** 2 '個の行数にもなります。したがって、上記のすべてがこのケースにも当てはまります。 – unutbu

関連する問題