web-dev-qa-db-ja.com

PYODBC to Pandas-DataFrameが機能していません-渡された値の形状は(x、y)であり、インデックスは(w、z)を意味します

以前はpyodbcをpythonで使用していましたが、新しいマシンにインストールしました(win 8 64ビット、Python 2.7 64ビット、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)を意味します

問題がどこにあるのかわかります。基本的に、1行だけをフェッチすると想像してください。次に、DataFrameは、1つの要素のみでそれを整形します(1,1)。 (1、X)が欲しいのですが、Xはリストの長さです。

なぜ動作が変わったのかわかりません。多分それは私が持っているPandasバージョン、またはpyodbcですが、更新には問題があります。いくつかのモジュールを更新しようとしましたが、使用するすべての方法を台無しにします(バイナリ-右側)マシン/インストール-pipインストール、簡単インストール、何でも!など、これは確かに非常に苛立たしいことです。Pythonの場合は今後Win 864ビットを避けるでしょう)。

実際の例:

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!

助けてください:)ありがとう!

14
user1350191

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)
39
Paul H

これは、カーソルがタプルのリストではなく、実際にはタプルに似ているRowオブジェクトのリストを返すためですが、pandasデータフレームコンストラクターを混乱させます。元の例では、 、データフレームを作成する前にこれを行います。

for i in range(0,len(temp)):
    temp[i]=Tuple(temp[i])
15
Gena Kukartsev