En una entrada anterior describimos cómo cargar datos desde un archivo CSV. En esta entrada, veremos cómo cargar los contenidos de una tabla SQL el un DataFrame.
Para ello usaremos el método DataFrame.read_sql().
Lo primero que necesitábamos es una base de datos MySQL (o similar) activa. Necesitamos establecer una conexión a la base de datos usando SQL Alchemy. SQL Alchemy es una librería muy potente para manejar bases de datos; si tienes tiempo para conocerla mejor, será muy útil si trabajas a menudo con bases de datos. Asimismo, necesitaremos instalar un driver de MySQL; en este caso, usaremos PyMySQL. Se puede obtener mediante using pip o el gestor de librerías de la distribución.
>>> from sqlalchemy import create_engine >>> engine = create_engine('mysql+pymysql://username:password@hostname:3306/dbname')
A continuación, con la conexión ya establecida, abrimos una tabla o ejecutamos una query SQL con el método DataFrame.read_sql().
>>> with engine.connect() as conn, conn.begin(): >>> data = pd.read_sql('mytable', conn) >>> print(data) User Age Email 0 Alice 21 alice@foo.com 1 Bob 11 bob@sponge.com 2 Charlie 32 charles@baz.com
Hemos usado ‘mytable’ para seleccionar la tabla completa, pero podemos ejecutar una query SQL:
>>> with engine.connect() as conn, conn.begin(): >>> data = pd.read_sql('select * from mytable where Age>18', conn) >>> print(data) User Age Email 0 Alice 21 alice@foo.com 1 Charlie 32 charles@baz.com
Una vez que los datos están en el objeto DataFrame, podemos manipularlos con la funcionalidad que proporciona Pandas.
>>> data['Domain'] = data.apply(lambda x: x['Email'].split('@')[1],axis=1) >>> print(data) User Age Email Domain 0 Alice 21 alice@foo.com foo.com 1 Bob 11 bob@sponge.com sponge.com 2 Charlie 32 charles@baz.com baz.com
Podemos guardar los resultados de nuevo en una base de datos con DataFrame.to_sql(). No obstante (y corrígeme en los comentarios si me equivoco), no podemos actualizar entradas existentes en una tabla. Tan sólo podemos crear una tabla nueva, sobreescribir una existente o concatenar los datos.
>>> with engine.connect() as conn, conn.begin(): >>> data.to_sql('mytable_new',conn,index=False)
Esta es la funcionalidad más básica, y con ella podemos implementar toda la funcionalidad que sepamos hacer en SQL; siempre recordando que una vez que leemos los datos de la tabla, no tendremos acceso a las entradas que no fueron devueltas por la query (a menos que hagamos una nueva llamada a DataFrame.read_sql().
Para ver todas las opciones disponibles, podemos revisar las documentaciones de read_sql() y to_sql().