Saltar al contenido

¿Cómo insertar el marco de datos de pandas a través de mysqldb en la base de datos?

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:

ingrese la descripción de la imagen aquí

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:

  1. Escribir en la base de datos MySQL con pandas usando SQLAlchemy, to_sql
  2. Escribir un marco de datos de Pandas en MySQL
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *