如何修复';内存错误';当我试图在python中合并两个数据帧时

如何修复';内存错误';当我试图在python中合并两个数据帧时,python,pandas,Python,Pandas,我正在尝试交叉连接到表 import os import pandas as pd import sys import pyodbc con = pyodbc.connect("DRIVER= {NetezzaSQL};SERVER=netezza.xxx.com;PORT=5480;DATABASE=XXXXXX;UID=xxxxx;PWD=xxxxxxx;") con.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8') con.setdeco

我正在尝试交叉连接到表

import os
import pandas as pd
import sys
import pyodbc

con = pyodbc.connect("DRIVER= {NetezzaSQL};SERVER=netezza.xxx.com;PORT=5480;DATABASE=XXXXXX;UID=xxxxx;PWD=xxxxxxx;")

 con.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
 con.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
 con.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-8')
 con.setencoding(encoding='utf-8')


sql1 = """select * from table1"""
input1 = pd.read_sql_query(sql1,con)

                 student_name
          0      abc
          1      def
          2      ghi

sql2 = """select * from table2"""
input2 = pd.read_sql_query(sql2,con)

                  subjects
           0      maths
           1      english
我需要的是表1和表2上的交叉连接 如果我必须使用sql,那将是

   select table1.*, table2.* from table1 cross join table2

                   student_name    subjects
           0       abc             maths
           0       abc             english
           1       def             maths
           1       def             english
           2       ghi             maths
           2       ghi             english
我试图使用下面的代码行获得上面的输出,但它抛出了MemoryError。有没有办法改进代码

input1.assign(foo=1).merge(input2.assign(foo=1)).drop('foo',1)
2019年3月28日编辑: 由于上面的一个不起作用,我更改了代码以减少列。 为此,我将数据帧转换为列表,并在其上循环以创建列表形式的输出。 购买代码非常慢。有助于提高绩效吗? 我有一个数据帧,第一列是key,五列的值在0到1之间。 第二个数据帧具有不同的键作为第一列,5列的值为0或1

    a = input5.values.tolist()
    b = input6.values.tolist()
    c = []

for i in range(len(a)):
  for j in range(len(b)):
    denominator = ((a[i][1]*float(b[j][1]))+(a[i][2]*float(b[j][2]))+(a[i] 
     [3]*float(b[j][3]))+(a[i][4]*float(b[j][4]))+(a[i][5]*float(b[j][5])))
    numerator = (a[i][1]+a[i][2]+a[i][3]+a[i][4]+a[i][5])
    mean = numerator/denominator
    new_row = [a[i][0],b[j][0],mean]
    c.append(new_row)
len(c)

我没有从数据库中读取数据,而是将两个输入数据帧创建为:

input1 = pd.DataFrame({'student_name': [ 'abc', 'def', 'ghi' ]})
input2 = pd.DataFrame({'subject': [ 'maths', 'english' ]})
关于“名称中保留逻辑”的一个细节:正如您所说的
input1
单数方式的列名(学生姓名), 我也照做了,并在
input2
中使用了列名 单数方式(主题)

然后,对于这种有限的数据帧,可以执行如下合并:

pd.merge(input1.assign(foo=1), input2.assign(foo=1),
    on='foo')[['student_name', 'subject']]
(您的解决方案不包括class='foo'上的
,但实际上是默认设置
of join列都是公共列,因此可以忽略它)

至少在我的电脑上,对于这样有限的数据,上面的命令是有效的

但是,如果您尝试合并,问题可能会继续存在 real数据帧,包含更多的行

请记住,行数是来自的行数的乘积 两个源数据帧

如果在实际数据中仍然存在相同的错误,请尝试使用
两个源数据帧中的记录数较少。

是否要实现两列的笛卡尔乘积?检查此链接,感谢您共享此链接。我在发布问题之前阅读了链接。代码只是解释问题的一个示例。抱歉,没有共享数据卷。我也试过用on='foo',我得到了同样的记忆。内存问题是真实的,因为数据量很大。如示例所示,数据不限于3条记录和2条记录。我正在尝试将dataframe1:1000 x 25与dataframe2 1000000x25连接起来,以创建dataframe3:1000000000x50。代码可以很好地处理较少的记录。另一个概念是:将连接保留到数据库。但仍然存在同样的风险,即输出太大,无法装入内存。或者您的项目假设是错误的(没有考虑数据帧的大小)?你确定你真的需要如此大的表的笛卡尔积吗?嗨,Valdi,最初我们在数据库方面尝试过,它有内存问题。因此,尝试在GPU服务器上使用python。需求是真实的,我们添加了一些条件,并将输出需求从100亿行减少到28亿行。仍然有记忆的挑战。