Python 值错误:合并时不允许负维度

Python 值错误:合并时不允许负维度,python,pandas,Python,Pandas,我正在合并2个数据帧。它们最初是.csv文件,每个文件只有7兆字节(2列和290000行)。我是这样合并的: merge=pd.merge(df1,df2, on=['POINTID'], how='outer') 在32位Anaconda中,我得到: ValueError:不允许负维度 但在64位Anaconda上,我得到了一个内存错误 我有12G的RAM,只有30%的内存在使用,所以这不应该是内存问题。我在另一台计算机上试过,也遇到了同样的问题。在32位计算机上,默认的NumPy整数数据类

我正在合并2个数据帧。它们最初是
.csv
文件,每个文件只有7兆字节(2列和290000行)。我是这样合并的:

merge=pd.merge(df1,df2, on=['POINTID'], how='outer')
在32位Anaconda中,我得到:

ValueError:不允许负维度

但在64位Anaconda上,我得到了一个内存错误


我有12G的RAM,只有30%的内存在使用,所以这不应该是内存问题。我在另一台计算机上试过,也遇到了同样的问题。

在32位计算机上,默认的NumPy整数数据类型是
int32
。 在64位计算机上,默认的NumPy整数数据类型是
int64

int32
int64
表示的最大整数为:

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

In [87]: np.iinfo('int64').max
Out[87]: 9223372036854775807
因此,
pd.merge
创建的整数索引在32位机器上最多支持
2147483647=2**31-1
行,在64位机器上最多支持
9223372036854775807=2**63-1

理论上,与
外部连接合并的两个290000行数据帧可能有多达
290000**2=84100000000
行。自

In [89]: 290000**2 > np.iinfo('int32').max
Out[89]: True
32位计算机可能无法生成足够大的整数索引来索引合并结果

尽管64位机器理论上可以生成一个足够大的整数索引来容纳结果,但您可能没有足够的内存来构建840亿行数据帧

当然,现在合并的数据帧可能少于840亿行(确切的数字取决于
df1['POINTID']
df2['POINTID']
中出现的重复值的数量),但是上面的信封背面计算表明,您看到的行为与存在大量重复值是一致的


PS.如果存在算术溢出,则在NumPy数组中添加或乘以正整数时可以得到负值:

In [92]: np.int32(290000)*np.int32(290000)
Out[92]: -1799345920
我猜这就是例外的原因:

ValueError: negative dimensions are not allowed

你能在样品上试一试吗
pd.merge(df1[:100],df2[:100],on=['POINTID'],how='outer')
使用'outer'我不太确定内存。这确实有效,但我使用outer将比这更大的文件连接在一起,没有问题。结果是否如预期的那样?有时,在合并时,可能会出现对齐问题,这会引入许多NAN。这就是为什么我说可能是内存问题。是的,它们看起来和预期的一样,里面有NaN,但应该有。它没有被它们淹没,所以我设置了两个数据帧,每个数据帧有1486970行,使用
left
合并,同样的内存错误出现
1486970>290000
,而
left
合并也会导致
N**2
行数。所以上面写的所有内容也适用于这个案例。