2016-08-24 40 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

你可以试试一个样品? 'pd.merge(df1 [:100],df2 [:100],on = ['POINTID'],how ='outer')'with'outer'我不太确定内存。 – ayhan

+0

确实有效,但是我使用outer来加入更大的文件,并且没有问题。 –

+0

结果是否符合预期?有时在合并时,您可能会遇到引入许多NaN的对齐问题。这就是为什么我说这可能是内存问题。 – ayhan

回答

5

在32位机器上,默认的NumPy integer dtype是int32。 在64位机器上,默认的NumPy integer dtype是int64

int32int64表示的最大整数是:

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

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

因此,通过pd.merge创建的整数指数将最多2147483647 = 2**31-1行支持32位计算机上,并在64 9223372036854775807 = 2**63-1行bit机器。

理论上,与outer连接合并的两个290000行DataFrame可能有多达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行,并使用“left”合并,并出现相同的内存错误 –

+0

'1486970> 290000',并且“left”合并可以也会导致“N ** 2”行数。所以上面写的所有内容也适用于这种情况。 – unutbu