Solución:
Actualizar:
Ahora hay un to_sql
método, que es la forma preferida de hacer esto, en lugar de write_frame
:
df.to_sql(con=con, name="table_name_for_df', if_exists="replace", flavor="mysql")
También tenga en cuenta: la sintaxis puede cambiar en pandas 0.14 …
Puede configurar la conexión con MySQLdb:
from pandas.io import sql
import MySQLdb
con = MySQLdb.connect() # may need to add some other options to connect
Establecer el flavor
de write_frame
para 'mysql'
significa que puede escribir en mysql:
sql.write_frame(df, con=con, name="table_name_for_df",
if_exists="replace", flavor="mysql")
El argumento if_exists
le dice a los pandas cómo lidiar si la mesa ya existe:
if_exists: {'fail', 'replace', 'append'}
, defecto'fail'
fail
: Si existe una tabla, no haga nada.
replace
: Si la tabla existe, suéltela, vuelva a crearla e inserte los datos.
append
: Si existe una tabla, inserte los datos. Crear si no existe.
Aunque el write_frame
docs actualmente sugiere que solo funciona en sqlite, mysql parece ser compatible y, de hecho, hay bastantes pruebas de mysql en la base de código.
Andy Hayden mencionó la función correcta (to_sql
). En esta respuesta, daré un ejemplo completo, que probé con Python 3.5 pero también debería funcionar para Python 2.7 (y Python 3.x):
Primero, creemos el marco de datos:
# Create dataframe
import pandas as pd
import numpy as np
np.random.seed(0)
number_of_samples = 10
frame = pd.DataFrame({
'feature1': np.random.random(number_of_samples),
'feature2': np.random.random(number_of_samples),
'class': np.random.binomial(2, 0.1, size=number_of_samples),
},columns=['feature1','feature2','class'])
print(frame)
Lo que da:
feature1 feature2 class
0 0.548814 0.791725 1
1 0.715189 0.528895 0
2 0.602763 0.568045 0
3 0.544883 0.925597 0
4 0.423655 0.071036 0
5 0.645894 0.087129 0
6 0.437587 0.020218 0
7 0.891773 0.832620 1
8 0.963663 0.778157 0
9 0.383442 0.870012 0
Para importar este marco de datos a una tabla MySQL:
# Import dataframe into MySQL
import sqlalchemy
database_username="ENTER USERNAME"
database_password = 'ENTER USERNAME PASSWORD'
database_ip = 'ENTER DATABASE IP'
database_name="ENTER DATABASE NAME"
database_connection = sqlalchemy.create_engine('mysql+mysqlconnector://{0}:{1}@{2}/{3}'.
format(database_username, database_password,
database_ip, database_name))
frame.to_sql(con=database_connection, name="table_name_for_df", if_exists="replace")
Un truco es que MySQLdb no funciona con Python 3.x. Así que en su lugar usamos mysqlconnector
, que se puede instalar de la siguiente manera:
pip install mysql-connector==2.1.4 # version avoids Protobuf error
Producción:
Tenga en cuenta que to_sql
crea la tabla y las columnas si aún no existen en la base de datos.
Puedes hacerlo usando pymysql:
Por ejemplo, supongamos que tiene una base de datos MySQL con el siguiente usuario, contraseña, host y puerto y desea escribir en la base de datos ‘data_2’, si ya esta ahí o no.
import pymysql
user="root"
passw = 'my-secret-pw-for-mysql-12ud'
host="172.17.0.2"
port = 3306
database="data_2"
Si ya tiene la base de datos creada:
conn = pymysql.connect(host=host,
port=port,
user=user,
passwd=passw,
db=database,
charset="utf8")
data.to_sql(name=database, con=conn, if_exists="replace", index=False, flavor="mysql")
Si NO tiene la base de datos creada, también válido cuando la base de datos ya está allí:
conn = pymysql.connect(host=host, port=port, user=user, passwd=passw)
conn.cursor().execute("CREATE DATABASE IF NOT EXISTS {0} ".format(database))
conn = pymysql.connect(host=host,
port=port,
user=user,
passwd=passw,
db=database,
charset="utf8")
data.to_sql(name=database, con=conn, if_exists="replace", index=False, flavor="mysql")
Hilos similares:
- Escribir en la base de datos MySQL con pandas usando SQLAlchemy, to_sql
- Escribir un marco de datos de Pandas en MySQL