以前は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!
助けてください:)ありがとう!
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データフレームコンストラクターを混乱させます。元の例では、 、データフレームを作成する前にこれを行います。
for i in range(0,len(temp)):
temp[i]=Tuple(temp[i])