No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

groupby

18/24
Recursos

Permite agrupar datos en función de los demás. Es decir, hacer el análisis del DataFrame en función de una de las columnas.

  • Agrupar por Author y mostrar el conteo de los datos de las demás columnas
df_books.groupby('Author').count()
--->              Name    User Rating    Reviews    Price    Year   Genre
Abraham Verghese    2      2     2         2       2       2
Adam Gasiewski      1       1     1         1       1       1
Adam Mansbach       1       1     1         1       1       1
Adir Levy           1       1      1         1       1       1
  • Agrupar por Author y mostrar la media de los datos de las demás columnas
df_books.groupby('Author').median()
--->            User Rating    Reviews    Price    Year 
Abraham Verghese   4.6          4866       11      2010.5
Adam Gasiewski     4.4          3113       6       2017
Adam Mansbach      4.8          9568       9       2011
Adir Levy          4.8          8170       13      2019

La columna Author, en los casos anteriores, pasa a ser el índice.

  • Podemos usar loc y acceder a un dato específico del DataFrame. Agrupar por autor y mostrar la suma de los valores de las demás columnas para William Davis
df_books.groupby('Author').sum().loc['William Davis']
---> 
User Rating        8.8
Reviews        14994.0
Price             12.0
Year            4025.0
Name: William Davis, dtype: float64
  • Agrupar por author y mostrar la suma de los valores de las demás columnas. Colocar los índices que el DataFrame trae por defecto
df_books.groupby('Author').sum().reset_index()
--->              Author    User Rating    Reviews    Price    Year 
0         Abraham Verghese      9.2         9732       22      4021
1         Adam Gasiewski        4.4         3113       6       2017
2         Adam Mansbach         4.8         9568       9       2011
3         Adir Levy             4.8         8170       13      2019
  • La función agg() permite aplicar varias funciones al DataFrame una vez agrupado según una columna específica. Agrupar por Author y mostrar el mínimo y máximo de las demás columnas
df_books.groupby('Author').agg(['min','max'])
---> #muestra cada columna dividida en dos: min y max. Estas contienen los valores maximo y minimo de la columna para cada Author 
  • Agrupar por Author, obtener el mínimo y máximo de la columna ‘Reviews’ y sumar los valores de la columna ‘User Rating’
df_books.groupby('Author').agg({'Reviews':['min','max'], 'User Rating':'sum'})
--->                 Reviews min    Reviews max    User Rating 
Abraham Verghese         4866           4866          9.2
Adam Gasiewski           3113           3113          4.4
Adam Mansbach            9568           9568          4.8
Adir Levy                8170           8170          4.8
  • Agrupar por ‘Author - Year’ y contar los valores de las demás columnas
df_books.groupby(['Author','Year']).count()
--->                        Name    User Rating    Reviews    Price    Genre
('Abraham Verghese', 2010)   1       1     1         1        1
('Abraham Verghese', 2011)   1       1      1         1        1
('Adam Gasiewski', 2017)     1       1      1         1        1
('Adam Mansbach', 2011)      1       1      1         1        1

Reto

Lee este artículo sobre el método groupby y cuéntanos que otras funciones de agregación podemos usar

Contribución creada por: Edward Giraldo.

Aportes 52

Preguntas 11

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Se puede usar las funciones lambda en el método .agg(), para obtener funciones custom ya sea para modificar un valor o para filtrar valores.

Un ejemplo puede ser el siguiente:

df_books.groupby('Author').agg({'Year':lambda x: [i-2000 for i in x], 'Reviews':lambda x: sum([i**2 for i in x])})

En donde a la columna Year se le resta 2000 a los años, y se obtiene una lista de los dos últimos dígitos del año relacionado con cada autor. Otro ejemplo es que los Reviews en vez de sumar cada valor se suma el cuadrado de sus valores.

El resultado que obtuve es el siguiente:

Para aplicar una sola función al agrupamiento tambien se puede usar la función .apply(). La función .agg() se utiliza cuando se desean hacer dos o más cálculos.

Aquí la documentación donde se compara SQL y funciones de pandas.

.sample() es muy buena para poder analizar el resultado de nuestras lineas de código.

Otra cosa que se solicita MUCHO en las pruebas técnicas. De verdad es una clase más para repasar y repasar más y mejor.

Groupby

Permite agrupar datos en funcion de los demas . Es decir, hacer el analisis del dataframe en funcion de una de las columnas.

  • llamamos el dataFrame que vamos a manipular
import pandas as pd
df_books = pd.read_csv('bestsellers-with-categories.csv', sep=',', header=0)
df_books.head(2) ---> #muestra las dos primeras lineas del dataFrame
  • Agrupar por Author y mostrar el conteo de los datos de las demas columnas
df_books.groupby('Author').count()
--->              Name    User Rating    Reviews    Price    Year   Genre
**Abraham Verghese    2         2             2         2       2       2
Adam Gasiewski      1         1             1         1       1       1
Adam Mansbach       1         1             1         1       1       1
Adir Levy           1         1             1         1       1       1**
  • Agrupar por Author y mostrar la media de los datos de las demas columnas
df_books.groupby('Author').median()
--->            User Rating    Reviews    Price    Year 
**Abraham Verghese   4.6          4866       11      2010.5
Adam Gasiewski     4.4          3113       6       2017
Adam Mansbach      4.8          9568       9       2011
Adir Levy          4.8          8170       13      2019**
  • La columna Author, en los casos anteriores, pasa a ser el indice. Podemos usar loc y acceder a un dato especifico del dataFrame. Agrupar por autor y mostrar la suma de los valores de las demas columnas para William Davis
df_books.groupby('Author').sum().loc['William Davis']
---> 
User Rating        8.8
Reviews        14994.0
Price             12.0
Year            4025.0
Name: William Davis, dtype: float64
  • Abrupar por author y mostrar la suma de los valores de las demas columnas. Colocar los indices que el dataFrame trae por defecto
df_books.groupby('Author').sum().reset_index()
--->              Author    User Rating    Reviews    Price    Year 
0         Abraham Verghese      9.2         9732       22      4021
1         Adam Gasiewski        4.4         3113       6       2017
2         Adam Mansbach         4.8         9568       9       2011
3         Adir Levy             4.8         8170       13      2019
  • La funcion agg() permite aplicar varias funciones al dataFrame una vez agrupado segun una columna especifica. Agrupar por Author y mostrar el minimo y maximo de las demas columnas
df_books.groupby('Author').agg(['min','max'])
---> #muestra cada columna dividida en dos: min y max. Estas contienen los valores maximo y minimo de la columna para cada Author 
  • Agrupar por Author, obtener el minimo y maximo de la columna Reviews y sumar los valores de la columna User Rating
df_books.groupby('Author').agg({'Reviews':['min','max'], 'User Rating':'sum'})
--->                 Reviews min    Reviews max    User Rating 
Abraham Verghese         4866           4866          9.2
Adam Gasiewski           3113           3113          4.4
Adam Mansbach            9568           9568          4.8
Adir Levy                8170           8170          4.8
  • Agrupar por Author - Year y contar los valores de las demas columnas
df_books.groupby(['Author','Year']).count()
--->                        Name    User Rating    Reviews    Price    Genre
('Abraham Verghese', 2010)   1           1            1         1        1
('Abraham Verghese', 2011)   1           1            1         1        1
('Adam Gasiewski', 2017)     1           1            1         1        1
('Adam Mansbach', 2011)      1           1            1         1        1

¿Seré al único que le ocurre que cuando saluda el profe, se me viene a la cabeza la canción del frailejón Ernesto Pérez?

Agregue le método sort_values, que seria similar a order by (sql)

Que buen curso ✨✨lpm✨✨

Groupby


👇🏻👇🏻

.groupby( columna ) → filtrando grupos a partir de una columna o… agregacion
|

| ☑️.groupby( columna ).agg*👇🏻

Por si requieren ordernar el groupby

df_books.groupby('Author').count().reset_index().sort_values(by='Name', ascending=False)

Aquí tienen un link donde se traducen sentencias SQL a Pandas, para que aquellos que ya conocían SQL
https://www.linkedin.com/pulse/como-escribir-tus-consultas-sql-en-pandas-vs-carlos-villena-azua/?originalSubdomain=es

Para groupby se ve mucho mejor en colab que en deepnote

En caso de que a alguien no le funcione: `(df_books.groupby('Author').mean()` pruebe: (df\_books.groupby('Author')\[df\_books.select\_dtypes(np.number).columns]).mean() ![](https://static.platzi.com/media/user_upload/image-bf19a65c-d658-4ef9-801e-a7a903415ab8.jpg)
Tengo el Error con `.mean()` Alguien sabe como solucionarlo? Me funcionan los de otro tipo como `.min()`, `.max()`, pero me sigue fallando con .mean() Creo que tiene que ver con las columnas que no son numericas...

Puedes agregar y elegir que tipo de calculo hacer en cada caso, teniendo en cuenta el tipo y naturaleza del dato, así como renombrar cada columna de salida, Por ejemplo:

df_group= df('field_group').agg(newfield1=('old_field1',sum), # sumar todos los valores
                                    newfield2=('old_field2',mean), # una media de todos los valores
                                    newfield3=('old field3',list).reset_index() # una lista con todos los elementos que se encontró para esa categoría

Usando el metodo .apply().
En este caso para sumar el Rating total por Author.

Otra forma de usar lambda y cambiar el nombre a la columna sería la siguiente:

df_books.groupby('Author').agg( 
						Precio_Promedio_Mil= ('Price', lambda x : sum(i * 1000 for i in x)),
					Rating_de_Usuario=('User Rating','mean')
							)

En Pandas se puede trabajar con múltiples índices. GROUPBY puede trabajar con los índices individualmente por medio de parámetro LEVEL.

df_books = pd.read_csv('/content/VIDEO 12 bestsellers-with-categories.csv',sep=',',header=0)
df_books.head(2)


Las columnas Author y año las convierto en índices y lo ordeno para que se vea mejor.

df_books_isort =df_books.set_index(['Author','Year']).sort_index(ascending = [True,False] )
df_books_isort

LEVEL usado con etiquetas.

df_books_isort.groupby(level="Year").mean()

LEVEL usado el número de orden del índice.

df_books_isort.groupby(level=0).mean()
Funciones de Agregación: 'sum': Suma de los valores. 'mean': Media de los valores. 'max': Valor máximo. 'min': Valor mínimo. 'count': Cuenta de los valores no nulos. 'std': Desviación estándar. 'var': Varianza. 'mediana': Mediana first: Primer valor no nulo. last: Último valor no nulo. idxmax: Índice del valor máximo. idxmin: Índice del valor mínimo. size: Número total de elementos. sem: Error estándar de la media. prod: Producto de los valores. mad: Desviación absoluta media. mode: Moda. nunique: Número de valores únicos. cumsum: Suma acumulativa. cumprod: Producto acumulativo. cummin: Mínimo acumulativo. cummax: Máximo acumulativo.

Esta es la estructura general de la función groupby según los recursos del curso:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=_NoDefault.no_default, squeeze=_NoDefault.no_default, observed=False, dropna=True)

Información resumida de esta clase
#EstudiantesDePlatzi

  • Puedo organizar mis datos en una variable común, es decir, agruparlos por cierta condición

  • Usando la función groupby puedo hacer que se agrupen definiendo la variable por la que quiero que se organicen

  • De manera simultánea puedo filtrar y realizar algunas operaciones con estos datos, es decir, puedo filtrar por cierta condición y al mismo tiempo tener la suma de estos datos

  • Puedo realizar múltiples combinaciones agrupando mis datos, ya sea por la llave de agrupamiento o por los resultados en funciones de agregación

  • Es importante entender las consultas de SQL

Gracias a la función groupby pude hacer lo que quería con un dataframe con la columna ‘Price’ en su mayoría lleno de NaN, quería llenar valores faltantes pero no por la media de todo el dataframe si no de cada compañía ‘Company’, primero fue poderles cambiar el tipo de Object a float ya que no me lo permitía por los str.

df['Price'] = pd.to_numeric(df['Price'],errors = 'coerce')

después lo que por fin pude resolver, que aliviada me siento la verdad.

df['Price'] = df.groupby('Company').transform(lambda x: x.fillna(x.mean()))
Cuando coloco este código con mean, me da error, no sucede lo mismo con max, min, count, sum. Por favor, si alguien sabe la solución. `df_books.groupby('Author').mean()` The above exception was the direct cause of the following exception: TypeError Traceback (most recent call last) [\<ipython-input-20-b6a0de8d28d9>](https://localhost:8080/#) in \<cell line: 1>() \----> 1 df\_books.groupby('Author').mean()
Para calcular por autor el promedio de calificación de los usuarios, utilicé este código: `df_books.groupby('Author')['User Rating'].mean().head(7)` ![](https://static.platzi.com/media/user_upload/image-8fb5f30d-7562-439f-aab5-e0d8c3e5077b.jpg)![]()
agregar nueva columna con el numero de ocurrencias (count) de un author: `df.groupby('authors', sort=False, dropna=False).agg( occurrences=pd.NamedAgg(column="authors", aggfunc="count"), rating_score_mean=("rating_score","mean"), rating_score_min=("rating_score","min"), rating_score_max=("rating_score","max") )`
Buenas tardes, cuando realizo conteos por categoría con count() no tengo lío. O al usar min() o max(). Pero cuando uso mean() o median(), me sale un error. Ayuda por favor!!...me sale esto entre otras cosas: "NotImplementedError: function is not implemented for this dtype: \[how->mean,dtype->object]"
`df_books.groupby('Author').agg(['min','max'])` Cuyo resultado se muestra a continuacion , en el nombre de Walter Isaacson se acomoda el min y el max de acuerdo al orden lexicográfico (orden alfabético), no en base a la cantidad de caracteres creo que entendi asi, es por eso que primero en min muestra a Leonardo da Vince y despues a Steve Jobs.
Buenos dias, me quedo una duda respecto a: ```js df_books.groupby('Author').agg(['min','max']) ```Cuyo resultado se muestra a continuacion , en el nombre de Walter Isaacson se acomoda el min y el max de acuerdo al orden lexicográfico (orden alfabético), no en base a la cantidad de caracteres creo que entendi asi. es por eso que el resultado es : ![]()![](https://static.platzi.com/media/user_upload/image-f0152ec4-c1e5-415f-ab2a-ddf7f7780f38.jpg)
pandas es el sql de python
hola, alguien pudiera ayúdame, me da el siguiente error al querer colocar "Year, Author o cualquier otro de esta fila para poder realizar esta parte de los ejercicios. ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-02-26%20a%20las%2016.01.32-3f2acc7e-3ac4-40ff-a06c-671a6fd0eebc.jpg)

Este uso del groupby en pandas es lo mas dinamico que he visto. Ayuda mucho a comprender mas el codigo y como este puede ser implementado. Aqui comparto la solucion de mi reto:
![](

Groupby es muy poderoso. Podemos guardar los 10 mejores autores de libros de no ficción por año `best_authors = df_books.groupby(["Genre", "Author"]).agg({"User Rating": "mean"}).sort_values(by=["User Rating"], ascending=False).loc["Non Fiction"].head(10)`
En realidad, `df_books.groupby('Author').agg({'Reviews':['min','max'], 'User Rating':'sum'})` no está calculando los min y max, habría que ponerlos como función min() y max(). Si se fijan, los valores que muestra son idénticos para todos los elementos de Author. En DS es importante verificar lo que uno hace. En este caso, es a nivel demostrativo nada más.
Para los que tienen la(s) versión(es) nueva(s) de Pandas. el comando: `df_books.groupby('Author').median()` les fallará, deben cambiarlo a esta manera para que funcione: `df_books.groupby('Author').median(``numeric_only``=True)`

`books.groupby(['Author','Name'], group_keys=True)[['User Rating','Reviews','Price','Year']].apply(lambda x: x * -1)` Con este comando aplico una función Lambda a mis datos. Hago una agrupación por Autor y Nombre, selecciono solo las columnas "\['User Rating','Reviews','Price','Year']" para mostrarlas en la salida, y aplico la función lambda que para el ejemplo consta de multiplicar por "-1" ![](https://static.platzi.com/media/user_upload/image-25e4b1e5-c915-4f3f-b7c2-646f1f1d1a3c.jpg)

mi tarea:!

18. Groupby

import pandas as pd

df_books = pd.read_csv('/content/bestsellers-with-categories_e591527f-ae45-4fa5-b0d1-d50142128fa6.csv')
df_books.head(2) #traer los n primeros registros de mi notebook

df_books.groupby('Author').count() #Agrupar por...

df_books.groupby('Author').count().reset_index

df_books.groupby('Author').agg(['min','max'])

df_books.groupby('Author').agg({'Reviews':['min','max'], 'User Rating':'sum'})

df_books.groupby(['Author','Year']).count

Una suma de todo en una linea …

df_books[df_books[‘Year’] > 2016].iloc[:,1:5].groupby(‘Author’).agg({‘User Rating’:[‘count’,‘max’],‘Reviews’:‘min’,‘Price’:‘sum’})

.agg

Esta funcionalidad da mucha más libertad a la hora de trabajar con Pandas 👍🚀🔥

Agrupar datos

  • Para agrupar datos en pandas usamos el método groupby() y luego podemos aplicar una funcion de agregación (sea count, mean, min, max…), o podemos aplicar varias funciones con el método agg: agg([functions]), ejemplos:
df.groupby('n_col').max()
df.groupby('n_col').agg(max,mean)
df.groupby(['col1','col2']).agg('col3':['sum',mean], 'col4':'sum')
	Name	User Rating	Reviews	Price	Genre

Author Year
Abraham Verghese 2010 1 1 1 1 1
2011 1 1 1 1 1
Adam Gasiewski 2017 1 1 1 1 1
Adam Mansbach 2011 1 1 1 1 1
Adir Levy 2019 1 1 1 1 1
… … … … … … …
Wizards RPG Team 2017 1 1 1 1 1
2018 1 1 1 1 1
2019 1 1 1 1 1
Zhi Gang Sha 2009 1 1 1 1 1
2013 1 1 1 1 1

Existe una alternativa dentro de pandas llamada pivot_table. Sin duda mi opción favorita cuando deseo agrupar datos 😄.

Mis apuntes #19

El uso de groupby pudiendo filtrar por un solo Author es fabuloso, me emocioné al pensar que puedo generar fichas de por ejemplo Hospitales, Municipios, Departamentos, Países

Lo que le dicen la emoción del nuevo jajajjajajajaj

reto

Permite agrupar datos en función de los demás. Es decir, hacer el análisis del DataFrame en función de una de las columnas.
Agrupar por Autor y mostrar el conteo de los datos de las demás columnas
la agrupación es agrupar los datos que tienen algo en común en mi data frame
________________________________________
[1]
import pandas as pd
________________________________________
[22]
0 s
df_movie = pd.read_csv("/content/movies_.csv",sep=",",header=0)
df_movie.head(10)
________________________________________
[6]
df_books.groupby("genres").count()
#aca puedo saber cuantos registros hay en mi data frame en cada genero 
#agrpuando por una columna especifica como lo generes 
#que quiero de agregación 
________________________________________
[23]
0 s
df_movie.groupby("genres").mean ()
#tambien puedo saver los valores de la columna con mean, max, min
________________________________________
[24]
0 s
df_movie.groupby("genres").max()
________________________________________
[9]
df_movie.groupby("genres").sum()
#tambiem puedo sumar los valores aca me esta cumado aca columna en general,
#si detallamos bien genres, esta mas abajo que las demas, eso es porque esta en este momento no es 
# una columna es el índice de mi data frame 
________________________________________
[10]
df_movie.groupby("genres").sum().loc["Action|Adventure"]
#como este el ince puedo entrar por loc y puedo sacar el resultado que es un agrupamiento espesificos 
#de (Action|Adventure) en cuantos a sumas 
movie            1108725
year               63588
Rating               175
Rotton Tomato       2386
Name: Action|Adventure, dtype: int64
________________________________________
[11]
df_movie.groupby("genres").sum().reset_index()
#con esta funcion genres pasa a ser parte de nuevo a columnas y el index queda a parte y el resto 
#de las columnas es la suma  el data frame original que teniamos en un comienso  
# de esta manera podemos agrupar valores y sacar cualquier valor de agregacion
________________________________________
[12]
df_movie.groupby("genres").agg(["min","max"])
#con esta funcion puedo  agregar funciones de agrupamienro, genres pasa a ser el index, y quiero 
#saber a nivel de (min y max) por cada columna que estoy trabajando, esto lo hacemos cuando queremos 
#dos métricas distintas 
________________________________________
[14]
df_movie.head(2)
________________________________________
[17]
df_movie.groupby("genres").agg({"year":["min","max"], "Rating": "sum"})
#asi puedo trabajar con cada una de las columnas o con cada una de las funciones de agregacion que tengo puedo trabajar bastante 
________________________________________
[25]
0 s
df_movie.groupby(["genres","title","year"]).count()
#aca se estan combinando multiples datos ya sea por la lleve de  agrupamiento o por la lleve que quiero de agregacion  
________________________________________
hacer agregaciones o agrupaciones en pandas es muy sencillo. arrastra mucho la lógica de SQL, se modo de hacer agregaciones es el que transfirió a pandas y es bastante útil al hacer estas agregaciones a nuestro data set
________________________________________
[19]
0 s
tips = pd.read_csv("/content/movies_.csv")
________________________________________
[20]
0 s
tips
________________________________________
[21]
0 s
tips.groupby("genres").size()
genres
(no genres listed)                     18
Action                                 39
Action|Adventure                       32
Action|Adventure|Animation             14
Action|Adventure|Animation|Children     3
                                       ..
Sci-Fi|Thriller                        13
Sci-Fi|Thriller|IMAX                    1
Thriller                               74
War                                     6
Western                                31
Length: 902, dtype: int64


Agrupamiento compuesto

aggregation por columnas especificas

Para recordar : Loc me permmite seleccionar datos a traves de susu indices y iloc me lo permite a traves de su posición dentro del dataframe