Agrupar por y filtrar con condiciones (SQL where y being) en Pandas

Para escribir una cláusula where con Pandas, proceda de la siguiente manera:

your_df.query('your_condition').groupby('your_col')  #Example:  interviews_df.query ("language == 'Python'").groupby("language")["salary"].mean()

Para escribir una cláusula de tener en Pandas, proceda de la siguiente manera:

your_df.groupby('your_col').filter(lambda_function)  #Example:  interviews_df.groupby('language').filter(lambda g: len(g) > 3)

Crear datos de ejemplo

Comenzaremos creando un marco de datos de muestra basado en un conjunto de datos de recursos humanos imaginario.

import pandas as pd  month = ['December', 'September', 'September', 'December', 'June', 'November'] language = ['Python', 'Python', 'R', 'Python', 'R', 'Python'] salary = [108.0, 143.0, 169.0, 149.0, 139.0, 121.0] data = dict(month = month, language = language, salary = salary) interviews_df = pd.DataFrame(data=data) 

Analicemos nuestros datos:

interviews_df.head()
mesidiomasalario0

1

2

3

4

Diciembre Pitón 108.0
Septiembre Pitón 143.0
Septiembre R 169.0
Diciembre Pitón 149.0
Junio R 139.0

Podemos agregar fácilmente los datos por idioma usando el fragmento a continuación

interviews_df.groupby('language')["salary"].mean().reset_index()
idiomassalario0

1

Pitón 160.25
R 154.00

Agregar por un valor de columna específico

En nuestro primer ejemplo, nos gustaría agregar los datos por columna de idioma, pero solo tomar en consideración aquellas filas que incluyen el valor ‘Python’. Esto es similar a escribir una cláusula WHERE en SQL. En Pandas usaremos el método DataFrame query(), que permite filtrar solo las filas relevantes para agregar y luego agruparlas.

(interviews_df  .query ("language == 'Python'")  .groupby("language")["salary"].mean()  .reset_index())

Esto devuelve los siguientes resultados:

idiomassalario0

Pitón 160.25

Grupo con múltiples condiciones

En este ejemplo, usaremos una condición compleja para filtrar nuestros datos, por ejemplo, nos gustaría agrupar solo los registros pertenecientes al lenguaje Python con un salario superior a 130K:

(interviews_df .query ("language == 'Python' & salary > 130") .groupby("month")["salary"].mean() .reset_index())

Esto devolverá lo siguiente:

salario mensual0

1

2

Diciembre 158.5
Noviembre 181.0
Septiembre 143.0

Agrupar por conteo y filtrar por tamaño de grupo

En este ejemplo, escribiremos una cláusula de SQL en Pandas. Usaremos la función de filtro y escribiremos una función lambda que filtrará los idiomas con menos de tres observaciones:

interviews_df.groupby('language').filter(lambda g: len(g) > 3)

Esto devuelve solo las filas relacionadas con las entrevistas relacionadas con el lenguaje Python:

mesidiomasalario0

1

3

5

Diciembre Pitón 168.0
Septiembre Pitón 143.0
Diciembre Pitón 149.0
Noviembre Pitón 181.0

Agregar y filtrar por suma de valores

Del mismo modo, podemos filtrar por suma o valores promedio. En este caso, nos gustaría filtrar las filas relacionadas con los idiomas cuyo salario agregado fue inferior a 400 000.

interviews_df.groupby('language').filter(lambda g: g['salary'].sum() < 400)