PYODBC to Pandas - DataFrame не работает - форма передаваемых значений (x,y), индексы подразумевают (w,z)

Раньше я использовал pyodbc с python, но теперь я установил его на новую машину ( win 8 64 bit, Python 2.7 64 bit, PythonXY с 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, но обновление проблематично. Я пытался обновить некоторые модули, но он испортил все, любой метод, который я использую (двоичные файлы - для правильной машины / установки - установка в pip, легкая установка, что угодно! И т. Д.), Что действительно очень расстраивает. Я бы, вероятно, избегал Win 8 64 бит отныне для Python).

Реальные примеры:

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'])

abc 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!

Пожалуйста, помогите:) Спасибо!

2 ответа

Начиная с 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])
Другие вопросы по тегам