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