PYODBC aux Pandas - DataFrame pas de travail - Forme de valeurs (x,y), les indices implique (w,z)
J'ai utilisé pyodbc avec python avant, mais maintenant, j'ai installé sur une nouvelle machine ( win 8 64 bits, Python 2.7 64 bits, PythonXY avec Spyder).
Avant que j'ai utilisé pour (en bas, vous pouvez trouver plus d'exemples réels):
columns = [column[0] for column in cursor.description]
temp = cursor.fetchall()
data = pandas.DataFrame(temp,columns=columns)
et cela fonctionne très bien. Il semble maintenant que DataFrame n'est pas en mesure de convertir les données récupérées à partir du curseur plus. Il retourne:
Forme de valeurs (x,y), les indices implique (w,z)
J'ai un peu de voir où est la question. En gros, imaginez que je chercher une seule ligne. Puis DataFrame tiens à le façonner (1,1), un élément seulement. Alors que j'aimerais avoir (1,X) où X est la longueur de la liste.
Je ne suis pas sûr de savoir pourquoi le comportement est modifié. Peut-être que c'est les Pandas version que j'ai, ou le pyodbc, mais la mise à jour, est problématique. J'ai essayé de mettre à jour certains modules, mais c'vis de tout, toute méthode que j'utilise (binaires-pour le droit de la machine/de l'installation--pip installer, facile à installer,n'importe quoi! etc.. ce qui est très frustrant en effet. Je serais probablement éviter de Win 8 64 bits à partir de maintenant pour Python).
Exemples réels:
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)
Retourne:
* ValueError: Forme de valeurs passées est (1, 1540), les indices implique (51, 1540)
Avis que:
ipdb> type(data)
<type 'list'>
ipdb> np.shape(data)
(1540, 51)
ipdb> type(data[0])
<type 'pyodbc.Row'>
Maintenant, par exemple, si nous le faisons:
ipdb> DataFrame([1,2,3],columns=['a','b','c'])
* ValueError: Forme de valeurs passées est (1, 3), les indices implique (3, 3)
et si nous le faisons:
ipdb> DataFrame([[1,2,3]],columns=['a','b','c'])
a b c
0 1 2 3
Cependant, même en essayant:
ipdb> DataFrame([data[0]], columns=columns)
*** ValueError: Shape of passed values is (1, 1), indices imply (51, 1)
ou
ipdb> DataFrame(data[0], columns=columns)
*** PandasError: DataFrame constructor not properly called!
S'il vous plaît aider 🙂 Merci!
qu'est-ce que
temp
utilisées, où data
vient d'où ?L'ajout de l'échantillon de données permettront d'améliorer la probabilité d'une réponse.
Bien sûr, la question est de savoir comment puis-je me débarrasser de l'erreur et obtenir des DataFrame(données,les colonnes=colonnes) de travail. Je l'ai dit ci-dessus: je voudrais avoir (1,X) où X est la longueur de la liste.
pourquoi avez-vous besoin de spécifier les noms de colonne? les pandas de les détecter automatiquement.
pandas.read_sql(query_string, cnxn_obj)
OriginalL'auteur user1350191 | 2013-11-18
Vous devez vous connecter pour publier un commentaire.
Comme des Pandas de 0,12 (je crois) que vous pouvez faire:
Avant de 0,12, vous pouvez faire:
Fichier "C:\Python27\lib\site-packages\pandas\core\frame.py" de ligne, 5338, dans _arrays_to_mgr retour create_block_manager_from_arrays(tableaux, arr_names, axes) dans le Fichier "C:\Python27\lib\site-packages\pandas\core\internals.py", de la ligne de 1825, dans create_block_manager_from_arrays construction_error(len(tableaux),les matrices[0].la forme[1:],axes) dans le Fichier "C:\Python27\lib\site-packages\pandas\core\internals.py", de la ligne de 1799, dans construction_error tuple(map(int, [len(ax) ax dans les axes])))) ValueError: Forme de valeurs passées est (51), les indices implique (51, 1402)
Pour être clair, ce qui se passe sur l'ENSEMBLE de mes machines, 2 de bureau et 1 portable. Il n'était pas le cas avant (j'ai mis à jour tous :/)
Je ne peux pas reproduire cela avec pyodbc 3.0.6. Pouvez-vous modifier votre question à me montrer exactement ce que vous faites lorsque vous essayez ma méthode? (laissez votre DB mot de passe, etc, évidemment).
C'est assez basique et similaire à ce que vous avez écrit. Je vais voir ce que je peux faire dès que je reçois quelques 10 minutes gratuites. Dans l'intervalle, considère que je suis en utilisant pyodbc 3.0.7 avec Python 2.7 (32 et 64 bits donne le même problème, à la fois pythonxy et anaconda de distribution).
OriginalL'auteur Paul H
C'est parce que le curseur retourne pas une liste de tuples, mais une liste de la Ligne des objets, qui sont semblables aux n-uplets, mieux, en fait, mais ils confondent les pandas dataframe constructeur. Dans l'exemple original, le faire avant la création de la trame de données:
df = pandas.DataFrame([tuple(t) for t in cursor.fetchall()])
OriginalL'auteur Gena Kukartsev