Saltar al contenido principal
InicioTutorialesSQL

Cómo usar SQL en pandas Usando pandasql Queries

Libere el poder de SQL dentro de pandas y aprenda cuándo y cómo utilizar consultas SQL en pandas utilizando la biblioteca pandasql para una integración perfecta.
may 2024  · 8 min leer

SQL, o Lenguaje de Consulta Estructurado, es un lenguaje de programación utilizado para acceder, extraer, manejar y explorar datos almacenados en bases de datos relacionales. pandas es una biblioteca de código abierto de Python diseñada específicamente para la manipulación y el análisis de datos.

En este tutorial, vamos a discutir cuándo y cómo podemos (y cuándo no podemos) utilizar la funcionalidad SQL en el marco de pandas. Además, veremos varios ejemplos de implementación de este enfoque y compararemos los resultados con el código equivalente en pandas puro.

¿Por qué usar SQL en pandas?

Dadas las definiciones de la introducción, ¿por qué querría uno utilizar SQL combinado con pandas cuando este último es un paquete todo incluido para el análisis de datos?

La respuesta es que en algunas ocasiones, especialmente para programas complejos, las consultas SQL parecen mucho más sencillas y fáciles de leer que el código correspondiente en pandas. Esto es particularmente cierto para aquellas personas que inicialmente utilizaban SQL para trabajar con datos y más tarde aprendieron pandas.

Si necesitas más formación sobre pandas, puedes consultar nuestro curso Manipulación de datos con pandas y Pandas Tutorial: DataFrames en Python.

Para ver la legibilidad de SQL en acción, supongamos que tenemos una tabla (un marco de datos) llamada penguins que contiene diversa información sobre los pingüinos (y trabajaremos con una tabla de este tipo más adelante en este tutorial). Para extraer todas las especies únicas de pingüinos que son machos y que tienen aletas de más de 210 mm, necesitaríamos el siguiente código en pandas:

penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique()

En su lugar, para obtener la misma información utilizando SQL, ejecutaríamos el siguiente código:

SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210

El segundo fragmento de código, escrito en SQL, parece casi una frase natural en inglés y, por tanto, es mucho más intuitivo. Podemos aumentar aún más su legibilidad repartiéndola en varias líneas:

SELECT DISTINCT species
  FROM penguins 
 WHERE sex = 'Male' 
   AND flipper_length_mm > 210

Ahora que hemos identificado las ventajas de usar SQL para pandas, veamos cómo podemos combinar técnicamente ambos.

Cómo utilizar pandasql

La librería pandasql Python permite realizar consultas a los dataframes de pandas ejecutando comandos SQL sin tener que conectarse a ningún servidor SQL. Bajo el capó, utiliza la sintaxis SQLite, detecta automáticamente cualquier dataframe pandas, y lo trata como una tabla SQL regular.

Configuración del entorno

En primer lugar, necesitamos instalar pandasql:

pip install pandasql

A continuación, importamos los paquetes necesarios:

from pandasql import sqldf
import pandas as pd

Arriba, importamos directamente la función sqldf de pandasql, que es prácticamente la única función con sentido de la biblioteca. Como su nombre indica, se aplica para consultar marcos de datos utilizando la sintaxis SQL. Aparte de esta función, pandasql viene con dos conjuntos de datos sencillos incorporados que se pueden cargar utilizando las funciones autoexplicativas load_births() y load_meat().

pandasql Syntax

La sintaxis de la función sqldf es muy sencilla:

sqldf(query, env=None)

Aquí, query es un parámetro obligatorio que toma una consulta SQL como cadena, y env-un parámetro opcional (y raramente útil) que puede ser locals() o globals() y permite a sqldf acceder al correspondiente conjunto de variables en tu entorno Python.

La función sqldf devuelve el resultado de una consulta como un marco de datos pandas.

Cuando podemos usar pandasql

La librería pandasql permite trabajar con datos utilizando el Lenguaje de Consulta de Datos (DQL), que es uno de los subconjuntos de SQL. En otras palabras, con pandasql podemos ejecutar consultas sobre los datos almacenados en una base de datos para recuperar de ella la información necesaria. En concreto, podemos acceder a los datos, extraerlos, filtrarlos, ordenarlos, agruparlos, unirlos, agregarlos y realizar operaciones matemáticas o lógicas con ellos.

Cuando no podemos utilizar pandasql

pandasql no permite emplear ningún otro subconjunto de SQL aparte de DQL. Esto significa que no podemos aplicar pandasql para modificar (actualizar, truncar, insertar, etc.) tablas o cambiar (actualizar, borrar o insertar) los datos de una tabla.

Además, dado que esta biblioteca se basa en la sintaxis SQL, debemos tener cuidado con las peculiaridades conocidas de SQLite.

Ejemplos de uso de pandasql

Ahora, vamos a echar un vistazo más granular a cómo ejecutar consultas SQL en pandas dataframes utilizando la función sqldf de pandasql. Para tener algunos datos con los que practicar, vamos a cargar uno de los conjuntos de datos incorporados en la biblioteca seaborn-penguins:

import seaborn as sns
penguins = sns.load_dataset('penguins')
print(penguins.head())

Salida:

   species island     bill_length_mm  bill_depth_mm  flipper_length_mm  \
0  Adelie  Torgersen            39.1           18.7              181.0   
1  Adelie  Torgersen            39.5           17.4              186.0   
2  Adelie  Torgersen            40.3           18.0              195.0   
3  Adelie  Torgersen             NaN            NaN                NaN   
4  Adelie  Torgersen            36.7           19.3              193.0   

   body_mass_g     sex  
0       3750.0    Male  
1       3800.0  Female  
2       3250.0  Female  
3          NaN     NaN  
4       3450.0  Female

Si necesita refrescar sus conocimientos de SQL, nuestro curso de conocimientos básicos de SQL es un buen punto de referencia.

Extracción de datos con pandasql

print(sqldf('''SELECT species, island 
FROM penguins 
LIMIT 5'''))

Salida:

  species  island
0  Adelie  Torgersen
1  Adelie  Torgersen
2  Adelie  Torgersen
3  Adelie  Torgersen
4  Adelie  Torgersen

Más arriba, hemos extraído información sobre la especie y la geografía de los cinco primeros pingüinos del marco de datos penguins. Tenga en cuenta que la ejecución de la función sqldf devuelve un marco de datos pandas:

print(type(sqldf('''SELECT species, island 
                      FROM penguins 
                     LIMIT 5''')))

Salida:

<class 'pandas.core.frame.DataFrame'>

En puros pandas, sería:

print(penguins[['species', 'island']].head())

Salida:

   species island
0  Adelie  Torgersen
1  Adelie  Torgersen
2  Adelie  Torgersen
3  Adelie  Torgersen
4  Adelie  Torgersen

Otro ejemplo es la extracción de valores únicos de una columna:

print(sqldf('''SELECT DISTINCT species 
                 FROM penguins'''))

Salida:

     species
0     Adelie
1  Chinstrap
2     Gentoo

En pandas, sería:

print(penguins['species'].unique())

Salida:

['Adelie' 'Chinstrap' 'Gentoo']

Ordenación de datos con pandasql

print(sqldf('''SELECT body_mass_g 
                 FROM penguins 
                ORDER BY body_mass_g DESC 
                LIMIT 5'''))

Salida:

   body_mass_g
0       6300.0
1       6050.0
2       6000.0
3       6000.0
4       5950.0

Arriba, ordenamos nuestros pingüinos por masa corporal en orden descendente y mostramos los cinco valores más altos de masa corporal.

En pandas, sería:

print(penguins['body_mass_g'].sort_values(ascending=False, 
ignore_index=True).head())

Salida:

0    6300.0
1    6050.0
2    6000.0
3    6000.0
4    5950.0
Name: body_mass_g, dtype: float64

Filtrado de datos con pandasql

Intentemos el mismo ejemplo que mencionamos en el capítulo Por qué usar SQL en pandas: extraer las especies únicas de pingüinos que son machos y que tienen aletas de más de 210 mm de longitud:

print(sqldf('''SELECT DISTINCT species
                 FROM penguins 
                WHERE sex = 'Male' 
                  AND flipper_length_mm > 210'''))

Salida:

     species
0  Chinstrap
1     Gentoo

Más arriba, hemos filtrado los datos en función de dos condiciones: sex = 'Male' y flipper_length_mm > 210.

El mismo código en pandas parecería un poco más abrumador:

print(penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique())

Salida:

['Chinstrap' 'Gentoo']

Agrupación y agregación de datos con pandasql

Ahora, vamos a aplicar la agrupación y agregación de datos para encontrar el pico más largo de cada especie en el marco de datos:

print(sqldf('''SELECT species, MAX(bill_length_mm)
                 FROM penguins 
                GROUP BY species'''))

Salida:

     species  MAX(bill_length_mm)
0     Adelie                 46.0
1  Chinstrap                 58.0
2     Gentoo                 59.6

El mismo código en pandas:

print(penguins[['species', 'bill_length_mm']].groupby('species', as_index=False).max())

Salida:

     species  bill_length_mm
0     Adelie            46.0
1  Chinstrap            58.0
2     Gentoo            59.6

Realización de operaciones matemáticas con pandasql

Con pandasql, podemos realizar fácilmente operaciones matemáticas o lógicas sobre los datos. Imaginemos que queremos calcular la relación entre la longitud y la profundidad del pico de cada pingüino y mostrar los cinco valores más altos de esta medida:

print(sqldf('''SELECT bill_length_mm / bill_depth_mm AS length_to_depth
                 FROM penguins
                ORDER BY length_to_depth DESC
                LIMIT 5'''))

Salida:

   length_to_depth
0         3.612676
1         3.510490
2         3.505882
3         3.492424
4         3.458599

Observe que esta vez hemos utilizado el alias length_to_depth para la columna con los valores de ratio. De lo contrario, obtendríamos una columna con un nombre monstruoso bill_length_mm / bill_depth_mm.

En pandas, primero tendríamos que crear una nueva columna con los valores del ratio:

penguins['length_to_depth'] = penguins['bill_length_mm'] / penguins['bill_depth_mm']
print(penguins['length_to_depth'].sort_values(ascending=False, ignore_index=True).head())

Salida:

0    3.612676
1    3.510490
2    3.505882
3    3.492424
4    3.458599
Name: length_to_depth, dtype: float64

Conclusión

Para terminar, en este tutorial, hemos explorado por qué y cuándo podemos combinar la funcionalidad de SQL para pandas para escribir un código mejor y más eficiente. Discutimos cómo configurar y utilizar la biblioteca pandasql para este propósito y qué limitaciones tiene este paquete. Por último, consideramos numerosos ejemplos populares de la aplicación práctica de pandasql y, en cada caso, comparamos el código con su homólogo de pandas.

Ahora tienes todo lo que necesitas para aplicar SQL para pandas en proyectos del mundo real. Un lugar ideal para tu práctica es el DataLab, el cuaderno de datos de DataCamp habilitado para IA con gran compatibilidad SQL.

Temas

Amplíe sus conocimientos

Certificación disponible

Course

Manipulación de datos en SQL

4 hr
214.1K
Domine las complejas consultas SQL necesarias para responder a una amplia variedad de preguntas de ciencia de datos y prepare conjuntos de datos sólidos para su análisis en PostgreSQL.
See DetailsRight Arrow
Start Course
Ver másRight Arrow
Relacionado

tutorial

Cómo recortar una cadena en Python: Tres métodos diferentes

Aprenda los fundamentos del recorte de caracteres iniciales y finales de una cadena en Python.
Adel Nehme's photo

Adel Nehme

5 min

tutorial

Cómo instalar y configurar MySQL en Docker

Aprende a instalar y configurar bases de datos MySQL dentro de contenedores Docker. El tutorial incluye conceptos como la conexión a servidores MySQL, la ejecución de clientes MySQL para conectarse a contenedores, etc.
Bex Tuychiev's photo

Bex Tuychiev

12 min

tutorial

Pandas Profiling (ydata-profiling) en Python: Guía para principiantes

Aprenda a utilizar la biblioteca ydata-profiling en Python para generar informes detallados de conjuntos de datos con muchas características.
Satyam Tripathi's photo

Satyam Tripathi

9 min

tutorial

Guía completa de listas vacías en Python

Aprenda las principales operaciones con listas y los casos de uso de las listas vacías en Python.
Adel Nehme's photo

Adel Nehme

5 min

tutorial

CALIFICAR: La sentencia de filtrado SQL que nunca supo que necesitaba

Conozca la cláusula SQL QUALIFY, un método de filtrado esencial aunque poco conocido en SQL. Comprender su sintaxis, usos y en qué se diferencia de otros métodos de filtrado SQL.
Kurtis Pykes 's photo

Kurtis Pykes

8 min

tutorial

Guía paso a paso para hacer mapas en Python usando la librería Plotly

Haz que tus datos destaquen con impresionantes mapas creados con Plotly en Python
Moez Ali's photo

Moez Ali

7 min

See MoreSee More