81 votes

Importation de données d'une base de données MySQL dans un cadre de données Pandas, y compris les noms des colonnes.

J'importe des données d'une base de données MySQL dans un cadre de données Pandas. L'extrait suivant est le code que j'utilise :

import mysql.connector as sql
import pandas as pd

db_connection = sql.connect(host='hostname', database='db_name', user='username', password='password')
db_cursor = db_connection.cursor()
db_cursor.execute('SELECT * FROM table_name')

table_rows = db_cursor.fetchall()

df = pd.DataFrame(table_rows)

Lorsque j'imprime le cadre de données, il représente correctement les données, mais ma question est la suivante : est-il possible de conserver également les noms des colonnes ? Voici un exemple de sortie :

                          0   1   2     3     4     5     6     7     8
0  :ID[giA0CqQcx+(9kbuSKV== NaN NaN  None  None  None  None  None  None
1  lXB+jIS)DN!CXmj>0(P8^]== NaN NaN  None  None  None  None  None  None   
2  lXB+jIS)DN!CXmj>0(P8^]== NaN NaN  None  None  None  None  None  None   
3  lXB+jIS)DN!CXmj>0(P8^]== NaN NaN  None  None  None  None  None  None   
4  lXB+jIS)DN!CXmj>0(P8^]== NaN NaN  None  None  None  None  None  None   

Ce que je voudrais faire, c'est conserver le nom de la colonne, ce qui remplacerait les index de colonne de Pandas. Par exemple, au lieu d'avoir 0, le nom de la colonne serait : "Première_colonne" comme dans la table MySQL. Y a-t-il une bonne façon de procéder ? Ou existe-t-il une approche plus efficace que la mienne pour importer des données de MySQL dans un cadre de données Pandas ?

1 votes

Pourquoi n'utilisez-vous pas pd.read_sql() ?

15 votes

La question ici est liée à Base de données MySQL - et non SQLalchemy - comme demandé dans le duplicate . pd.read_sql() ne prend pas en charge la connexion mysql. Cette question ne doit pas être marquée comme étant un doublon. Pour répondre à la question : df = pd.DataFrame(table_rows, columns=db_cursor.column_names) fera ce qui lui est demandé.

1 votes

@kneewarp vous devriez poster ceci comme une réponse. La réponse acceptée ne fonctionnera pas avec une connexion MySQL, ce que le PO a demandé.

168voto

MaxU Points 5284

Il serait beaucoup plus efficace d'utiliser pandas pour lire les données de votre serveur MySQL :

from sqlalchemy import create_engine
import pandas as pd

db_connection_str = 'mysql+pymysql://mysql_user:mysql_password@mysql_host/mysql_db'
db_connection = create_engine(db_connection_str)

df = pd.read_sql('SELECT * FROM table_name', con=db_connection)

cela devrait également prendre en charge les noms de colonnes...

2 votes

Dans mon cas, cela a fonctionné, mais je ne pouvais plus interroger directement la table jusqu'à ce que je ferme la connexion : db_connection.close()

0 votes

En fonction de stackoverflow.com/questions/42118750/ . J'ai décidé d'utiliser MySQLdb à la place, comment réaliser cela dans MySQLdb ?

1 votes

On peut aussi utiliser mysql.connect pour connecter la base de données (au lieu d'importer deux paquets sqlalchemy & pymysql) et ensuite utiliser la fonction pd.read_sql.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X