PYODBC到Pandas - DataFrame不工作 - 传递值的形状是(x,y),索引暗示(w,z)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PYODBC到Pandas - DataFrame不工作 - 传递值的形状是(x,y),索引暗示(w,z)相关的知识,希望对你有一定的参考价值。

之前我使用pyodbc和python,但现在我已经将它安装在一台新机器上(win 8 64 bit,Python 2.7 64 bit,PythonXY with Spyder)。

在我习惯之前(在底部你可以找到更多真实的例子):

columns = [column[0] for column in cursor.description]
temp = cursor.fetchall()
data = pandas.DataFrame(temp,columns=columns)

它会工作正常。现在,似乎DataFrame无法再从光标提取的数据进行转换。它返回:

传递值的形状是(x,y),指数暗示(w,z)

我有点看问题在哪里。基本上,想象一下我只获取一行。然后DataFrame想要塑造它(1,1),只有一个元素。虽然我想(1,X),其中X是列表的长度。

我不确定为什么行为改变了。也许它是我拥有的Pandas版本,或pyodbc,但更新是有问题的。我试图更新一些模块,但它搞砸了一切,我使用的任何方法(二进制文件 - 用于正确的机器/安装 - 点子安装,易于安装,任何东西等等......这确实非常令人沮丧。我可能会避免从现在开始为Python赢取8位64位。

真实的例子:

sql = 'Select * form TABLE'
cursor.execute(sql)
columns = [column[0] for column in cursor.description]
data    = cursor.fetchall()
        con.close()
            results = DataFrame(data, columns=columns)

返回:* ValueError:传递值的形状为(1,1540),索引暗示(51,1540)

请注意:

ipdb> type(data)
<type 'list'>
ipdb> np.shape(data)
(1540, 51)
ipdb> type(data[0])
<type 'pyodbc.Row'>

现在,例如,如果我们这样做:

ipdb> DataFrame([1,2,3],columns=['a','b','c'])

* ValueError:传递值的形状为(1,3),索引意味着(3,3)

如果我们这样做:

ipdb> DataFrame([[1,2,3]],columns=['a','b','c'])

a b c 0 1 2 3

但是,即使尝试:

ipdb> DataFrame([data[0]], columns=columns)
*** ValueError: Shape of passed values is (1, 1), indices imply (51, 1)

要么

ipdb> DataFrame(data[0], columns=columns)
*** PandasError: DataFrame constructor not properly called!

请帮忙:)谢谢!

答案

截至Pandas 0.12(我相信)你可以这样做:

import pandas
import pyodbc

sql = 'select * from table'
cnn = pyodbc.connect(...)

data = pandas.read_sql(sql, cnn)

在0.12之前,您可以:

import pandas
from pandas.io.sql import read_frame
import pyodbc

sql = 'select * from table'
cnn = pyodbc.connect(...)

data = read_frame(sql, cnn)
另一答案

这是因为游标不返回元组列表,而是返回与元组类似的Row对象列表,实际上更好,但它们混淆了pandas dataframe构造函数。在原始示例中,在创建数据框之前执行此操作:

for i in range(0,len(temp)):
    temp[i]=tuple(temp[i])

以上是关于PYODBC到Pandas - DataFrame不工作 - 传递值的形状是(x,y),索引暗示(w,z)的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyODBC 的 fast_executemany 加速 pandas.DataFrame.to_sql

如何将 pandas DataFrame 导出到 Microsoft Access?

将pandas DataFrame写入sql时出现无效列名错误

使用 PYODBC 从 pandas 获取数据到 SQL 服务器

使用 pyodbc 和 pandas 将 CSV 加载到 .mdb

并行化 pandas pyodbc SQL 数据库调用