如何修复';内存错误';当我试图在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亿行。仍然有记忆的挑战。