我正在尝试交叉连接到表。
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'
,但实际上是默认设置 的联接列都是常用列,因此您可以省略它)。
至少在我的计算机上,对于如此有限的数据,上述命令有效。
但是,如果您尝试合并,问题可能会继续存在真正数据帧,包含明显更多的行。
请记住,行数是行数的乘积两个源数据帧。
如果您对实际数据仍有相同的错误,请尝试尝试使用 两个源数据帧中的记录数较少。