在32位机器上,默认的NumPy integer dtype是int32
。 在64位机器上,默认的NumPy integer dtype是int64
。
由int32
和int64
表示的最大整数是:
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
你可以试试一个样品? 'pd.merge(df1 [:100],df2 [:100],on = ['POINTID'],how ='outer')'with'outer'我不太确定内存。 – ayhan
确实有效,但是我使用outer来加入更大的文件,并且没有问题。 –
结果是否符合预期?有时在合并时,您可能会遇到引入许多NaN的对齐问题。这就是为什么我说这可能是内存问题。 – ayhan