Раньше я использовал pyodbc с python, но теперь я установил его на новую машину (выиграл 8 64 бит, Python 2.7 64 бит, 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 у меня есть, или pyobbc, но обновление проблематично. Я попытался обновить некоторые модули, но он завинчивает все, любой метод, который я использую (двоичные файлы - для правильной машины/установки - pip install, easy-install, что-нибудь! И т.д., Что очень расстраивает. Выиграйте 8 бит с этого момента для 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'])
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!
Пожалуйста, помогите:) Спасибо!