当我尝试在python中合并两个数据帧时如何修复'Memory Error'



我正在尝试交叉连接到表。

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

我试图使用以下代码行获得高于输出,但它抛出了 MemorryError。有什么方法可以改进代码吗?

input1.assign(foo=1).merge(input2.assign(foo=1)).drop('foo',1)

已编辑 3/28/2019: 由于上面的一个不起作用,我更改了代码以减少列。 为此,我将数据帧转换为列表,并循环使用它们以列表形式创建输出。 购买代码非常慢。对提高性能有什么帮助吗? 我有一个数据帧,键作为第一列,五列的值在 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方式的列名 (student_name), 我效仿并input2也采用了列名单数方式(主题)。

然后,对于此类有限的数据帧,可以按以下方式执行合并:

pd.merge(input1.assign(foo=1), input2.assign(foo=1),
on='foo')[['student_name', 'subject']]

(您的解决方案不包括on='foo',但实际上是默认设置 的联接列都是常用列,因此您可以省略它)。

至少在我的计算机上,对于如此有限的数据,上述命令有效。

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

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

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

最新更新