No tienes acceso a esta clase

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

Agrupaciones con groupby

18/32
Recursos

Aportes 47

Preguntas 0

Ordenar por:

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

La lógica de GroupBy es prácticamente la misma que la de SQL.
```python country_rank = revenue_per_country.sort_values(ascending=False) top3_best = country_rank.iloc[:3] print("Los 3 países con mayores ventas: primeros en el ranking:\n", top3_best) top3_worst = country_rank.iloc[-3:] print("Los 3 países con menores ventas: últimos en el ranking:\n", top3_worst) ```re ```python Los 3 países con mayores ventas: primeros en el ranking: Country United Kingdom 8187806.364 Netherlands 284661.540 EIRE 263276.820 dtype: float64 Los 3 países con menores ventas: últimos en el ranking: Country Czech Republic 707.72 Bahrain 548.40 Saudi Arabia 131.17 dtype: float64 ```Los 3 países con mayores ventas: primeros en el ranking: Country United Kingdom 8187806.364 Netherlands 284661.540 EIRE 263276.820 dtype: float64 Los 3 países con menores ventas: últimos en el ranking: Country Czech Republic 707.72 Bahrain 548.40 Saudi Arabia 131.17 dtype: float64
En \*\*Pandas\*\*, la función `groupby()` se utiliza para agrupar datos en un DataFrame según una o más columnas. Esta función es muy poderosa y se combina comúnmente con operaciones de agregación, como sumas, promedios, conteos, entre otros. A continuación te explico cómo usar `groupby()` con ejemplos: \### 1. \*\*Agrupar y aplicar una función de agregación\*\* El uso más común de `groupby()` es agrupar los datos por una columna y aplicar una función de agregación como `sum()`, `mean()`, `count()`, etc. \#### Ejemplo básico: ```python import pandas as pd \# Crear un DataFrame de ejemplo data = { 'nombre': \['Ana', 'Juan', 'Pedro', 'Ana', 'Juan', 'Pedro'], 'ciudad': \['Madrid', 'Barcelona', 'Sevilla', 'Madrid', 'Barcelona', 'Sevilla'], 'ventas': \[200, 150, 100, 250, 300, 120], 'anio': \[2021, 2021, 2021, 2022, 2022, 2022] } df = pd.DataFrame(data) \# Agrupar por la columna 'nombre' y sumar las ventas resultado = df.groupby('nombre')\['ventas'].sum() print(resultado) ``` \*\*Resultado:\*\* ``` nombre Ana 450 Juan 450 Pedro 220 Name: ventas, dtype: int64 ``` \### 2. \*\*Agrupar por múltiples columnas\*\* Puedes agrupar los datos por más de una columna para realizar análisis más complejos. ```python \# Agrupar por 'nombre' y 'ciudad' y calcular el promedio de ventas resultado = df.groupby(\['nombre', 'ciudad'])\['ventas'].mean() print(resultado) ``` \*\*Resultado:\*\* ``` nombre ciudad Ana Madrid 225.0 Juan Barcelona 225.0 Pedro Sevilla 110.0 Name: ventas, dtype: float64 ``` \### 3. \*\*Aplicar varias funciones de agregación\*\* Puedes aplicar múltiples funciones de agregación al mismo tiempo utilizando el método `agg()`. ```python \# Agrupar por 'ciudad' y aplicar múltiples funciones de agregación resultado = df.groupby('ciudad')\['ventas'].agg(\['sum', 'mean', 'max', 'min']) print(resultado) ``` \*\*Resultado:\*\* ``` sum mean max min ciudad Barcelona 450 225.0 300 150 Madrid 450 225.0 250 200 Sevilla 220 110.0 120 100 ``` \### 4. \*\*Filtrar resultados después de agrupar\*\* Puedes filtrar los grupos después de agrupar usando `filter()`, que te permite aplicar una condición para eliminar grupos específicos. ```python \# Filtrar ciudades donde la suma de ventas es mayor a 300 resultado = df.groupby('ciudad').filter(lambda x: x\['ventas'].sum() > 300) print(resultado) ``` \*\*Resultado:\*\* ``` nombre ciudad ventas anio 0 Ana Madrid 200 2021 1 Juan Barcelona 150 2021 3 Ana Madrid 250 2022 4 Juan Barcelona 300 2022 ``` \### 5. \*\*Agrupación y conteo\*\* Si deseas contar el número de ocurrencias en cada grupo, puedes usar `count()` o `size()`. ```python \# Contar el número de ventas por cada ciudad resultado = df.groupby('ciudad').size() print(resultado) ``` \*\*Resultado:\*\* ``` ciudad Barcelona 2 Madrid 2 Sevilla 2 dtype: int64 ``` \### 6. \*\*Iterar sobre grupos\*\* Puedes iterar sobre los grupos formados por `groupby()` usando un bucle `for`. Cada iteración te da el nombre del grupo y el sub-DataFrame correspondiente. ```python \# Iterar sobre los grupos por 'nombre' for nombre, grupo in df.groupby('nombre'): print(f"Nombre: {nombre}") print(grupo) ``` \*\*Resultado:\*\* ``` Nombre: Ana nombre ciudad ventas anio 0 Ana Madrid 200 2021 3 Ana Madrid 250 2022 Nombre: Juan nombre ciudad ventas anio 1 Juan Barcelona 150 2021 4 Juan Barcelona 300 2022 Nombre: Pedro nombre ciudad ventas anio 2 Pedro Sevilla 100 2021 5 Pedro Sevilla 120 2022 ``` \### 7. \*\*Agrupar y rellenar valores faltantes\*\* Si tienes valores faltantes, puedes usar `groupby()` junto con `transform()` para aplicar funciones sobre los grupos y rellenar esos valores. ```python \# Rellenar valores faltantes con la media del grupo df\['ventas'] = df.groupby('ciudad')\['ventas'].transform(lambda x: x.fillna(x.mean())) print(df) ``` \### 8. \*\*Agrupaciones con varias columnas y múltiples operaciones\*\* Si necesitas realizar varias operaciones en columnas diferentes, puedes usar `agg()` para especificar las funciones para cada columna. ```python \# Agrupar por 'anio' y aplicar funciones diferentes a 'ventas' y 'anio' resultado = df.groupby('anio').agg({ 'ventas': \['sum', 'mean'], 'anio': 'count' }) print(resultado) ``` \### 9. \*\*Restablecer el índice después de `groupby()`\*\* A veces, después de agrupar, el índice del resultado puede no ser el esperado. Puedes restablecer el índice con `reset\_index()`. ```python \# Agrupar por 'nombre' y restablecer el índice resultado = df.groupby('nombre')\['ventas'].sum().reset\_index() print(resultado) ``` \*\*Resultado:\*\* ``` nombre ventas 0 Ana 450 1 Juan 450 2 Pedro 220 ``` Estos son algunos de los usos más comunes de `groupby()` en \*\*Pandas\*\* para trabajar con datos agrupados. Si tienes algún caso específico o más preguntas sobre esto, no dudes en preguntar.
Solo por precaución, podemos tener el caso de que el que tiene más ventas (# de ventas) no necesariamente es el que más ganancia tiene. Ex: **100 ventas** de un producto que vale $2 = $200 **5 ventas** de un producto que vale $500 = $2500 Reto: Las preguntas son los 3 mejores y 3 peores países en ventas. ```js # Calcular el top 3 de mejores países por ventas top_countries = df.groupby('Country')['Quantity'].sum().nlargest(3) top_countries ``````js Country United Kingdom 939682 Netherlands 44187 EIRE 27191 dtype: int64 ``````js # Calcular el top 3 de peores países por ventas worst_countries = df.groupby('Country')['Quantity'].sum().nsmallest(3) worst_countries ``````js Country Bahrain 0 Saudi Arabia 75 Canada 88 dtype: int64 ```
💻 Solución al reto Resolví el reto de 2 formas * Forma #1: Los datos ya agrupados con los valores de ventas totales calculados, los ordené de forma descendente (para el top 3 mejores) y ascendente (para top 3 peores)** con la función **sort\_values()**, y tome los primeros 3 rows con la función **head(3).** ```python # Forma 1: top_3_best_sales = ( retail_df .groupby("Country") .apply(lambda x: (x["Quantity"] * x["UnitPrice"]).sum()) .sort_values(ascending=False) .head(3) ) print("Forma #1\n") print("Mejores 3:", top_3_best_sales) top_3_worst_sales = ( retail_df .groupby("Country") .apply(lambda x: (x["Quantity"] * x["UnitPrice"]).sum()) .sort_values(ascending=True) .head(3) ) print("\nPeores 3:", top_3_worst_sales) ``` Resultado: ```txt Forma #1 Mejores 3 Country United Kingdom 8187806.364 Netherlands 284661.540 EIRE 263276.820 dtype: float64 Peores 3 Country Saudi Arabia 131.17 Bahrain 548.40 Czech Republic 707.72 dtype: float64 ``` * Forma #2: Los datos ya agrupados con los valores de ventas totales calculados, aplique las funciones: * **nlargest(3)**: Devuelve los 3 resultados de mayor valor, es la combinación de **sort\_values(ascending=True)** y **head(3)**. * **nsmallest(3)**: Devuelve los 3 resultados de menor valor, es la combinación de **sort\_values(ascending=False)** y **head(3)**. ```js # Forma 2: top_3_best_sales = ( retail_df .groupby("Country") .apply(lambda x: (x["Quantity"] * x["UnitPrice"]).sum()) .nlargest(3) ) print("Forma #2\n") print("Mejores 3:", top_3_best_sales) top_3_worst_sales = ( retail_df .groupby("Country") .apply(lambda x: (x["Quantity"] * x["UnitPrice"]).sum()) .nsmallest(3) ) print("\nPeores 3:", top_3_worst_sales) ``` Resultado: ```txt Forma #2 Mejores 3: Country United Kingdom 8187806.364 Netherlands 284661.540 EIRE 263276.820 dtype: float64 Peores 3: Country Saudi Arabia 131.17 Bahrain 548.40 Czech Republic 707.72 dtype: float64 ```
![](https://static.platzi.com/media/user_upload/image-114628b2-48a1-4229-a104-5fb8f39c3c6c.jpg)
#### **1. Conteo de Entradas por País** country\_count = df\['Country'].value\_counts() print(country\_count) **Descripción**: * El método value\_counts() se utiliza en la columna Country para contar el número de ocurrencias de cada país en el conjunto de datos. * El resultado se almacena en country\_count y se imprime. **Resultado**: Una Serie donde el índice representa cada país y los valores representan el número de entradas para ese país. Por ejemplo: United Kingdom    495478 France              8557 Germany             9495 ... #### **2. Suma de Cantidades por País** country\_group = df.groupby('Country')\['Quantity'].sum() print(country\_group) **Descripción**: * El método groupby agrupa el conjunto de datos por Country. * La columna Quantity se suma para cada país. * El resultado se almacena en country\_group y se imprime. **Resultado**: Una Serie donde el índice representa cada país y los valores representan la cantidad total de artículos comprados por país. Por ejemplo: Australia    83653 Austria       2802 ... #### **3. Cálculo de Estadísticas para Unit Price por País** country\_stats = df.groupby('Country')\['UnitPrice'].agg(\['mean', 'sum']) print(country\_stats) **Descripción**: * El conjunto de datos se agrupa por Country y la columna UnitPrice se agrega utilizando las funciones mean y sum. * El resultado, country\_stats, contiene dos columnas: el promedio (mean) y el total (sum) de precios unitarios para cada país. **Resultado**: Un DataFrame donde cada fila representa un país, con columnas para el promedio y la suma de precios unitarios. Por ejemplo:             mean       sum Australia   3.22    4054.75 Austria     4.56    1701.52 ... #### **4. Suma de Cantidades por País y StockCode** country\_stock\_group = df.groupby(\['Country', 'StockCode'])\['Quantity'].sum() print(country\_stock\_group) **Descripción**: * El conjunto de datos se agrupa por Country y StockCode. * La columna Quantity se suma para cada combinación de país y código de producto. * El resultado, country\_stock\_group, muestra la cantidad total para cada código de producto en cada país. **Resultado**: Una Serie con un índice jerárquico (Country y StockCode) y las cantidades sumadas como valores. Por ejemplo: Country       StockCode Australia     15036        600               15056BL      480 ... #### **5. Cálculo de Ingresos Totales por País** def total\_revenue(group):     return (group\['Quantity'] \* group\['UnitPrice']).sum() revenue\_per\_country = df.groupby('Country').apply(total\_revenue) print(revenue\_per\_country) **Descripción**: * Una función personalizada total\_revenue calcula los ingresos totales de un grupo multiplicando Quantity y UnitPrice y sumando el resultado. * El método groupby agrupa el conjunto de datos por Country, y apply aplica la función total\_revenue a cada grupo. * El resultado, revenue\_per\_country, contiene los ingresos totales por país. **Resultado**: Una Serie donde el índice representa cada país y los valores representan los ingresos totales generados por ese país. Por ejemplo: Australia    137077.27 Austria       5480.40 ...
Hola! Les comparto una alternativa al reto: `revenue_per_country_top_3 = df.groupby('Country').apply(total_revenue).sort_values(ascending=False).head(3)print(revenue_per_country_top_3)` Resultado: Country United Kingdom 8187806.364 Netherlands 284661.540 EIRE 263276.820 `revenue_per_country_last_3 = df.groupby('Country').apply(total_revenue).sort_values(ascending=True).head(3)` `print(revenue_per_country_last_3)` Country Saudi Arabia 131.17 Bahrain 548.40 Czech Republic 707.72
Es increible la curiosidad del ser humano a cononcer nuevas herramientas <3 ```python #consulta de ganancias por pais, con funcion para ser mas dinamico las consultas def total_ganancias(group): return (group['Quantity'] * group['UnitPrice']).sum() ganacias_por_pais = df.groupby('Country').apply(total_ganancias) #realizar la consulta y crear una etiqueta df_ganancias = ganacias_por_pais.reset_index(name='TotalGananciasPais') print(df_ganancias) #la utilizacion de ascendig=False DA A ENTENDER QUE VA DE MAYOR A MENOR, TRUE ES LO CONTRARIO #.sourt_values da a enteneder que va a ordenar de una o mas columnas a referncias de la etiqueta y ascendig=False evaulacion_mejor_peor = df_ganancias.sort_values(by='TotalGananciasPais', ascending=False) print(f'Las mejores ventas por pais, la obtine:\n{evaulacion_mejor_peor[0:3]}\nmientras la ventas diminutivas fueron:\n{evaulacion_mejor_peor[-3:]}') ```
Aquí la manera en cómo solucioné el reto: ![](https://static.platzi.com/media/user_upload/image-2d6fedac-f33a-462b-8936-375ed3a54982.jpg) El método nlargest(n, columns) Selecciona las primeras `n` filas ordenadas por las columnas especificadas en `columns` en orden descendente. Por otro lado, el método nsmallest muestra los últimos valores de la lista de valores descendentes. Al final uso el método .sort\_values(ascending=False) para decir que el orden en que se muestran los valores sean descendente (ya que por defecto se muestra el peor país de primero) y, en mi caso, quiero que se vea al final, el peor país de todos en venta.
![](https://static.platzi.com/media/user_upload/image-afba9242-cac4-4124-99cd-892f7bf8af9c.jpg)
```python df['Total'] = df['Quantity'] * df['UnitPrice'] #print(df.head()) group_country = df.groupby('Country')['Total'].sum() group_country = group_country.sort_values(ascending=False) print(f'El top 3 de países que mas vendieron es : {group_country.head(3)}') print(f'El top 3 de países que menos vendieron es : {group_country.tail(3)}') ```df\['Total'] = df\['Quantity'] \* df\['UnitPrice']#print(df.head()) group\_country = df.groupby('Country')\['Total'].sum()group\_country = group\_country.sort\_values(ascending=False)print(f'El top 3 de países que mas vendieron es : {group\_country.head(3)}')print(f'El top 3 de países que menos vendieron es : {group\_country.tail(3)}')
```js most_revenue = revenue_per_country.sort_values(ascending=False, inplace=False).head(3) print(most_revenue) poor_revenue = revenue_per_country.sort_values(ascending=True, inplace=False).head(3) print(poor_revenue) ``````js Country United Kingdom 8187806.364 Netherlands 284661.540 EIRE 263276.820 dtype: float64 ``````js Country Saudi Arabia 131.17 Bahrain 548.40 Czech Republic 707.72 dtype: float64 ```
Tenemos un codigo como el siguiente: ```js # Top 3 paises en ventas Top_3_Country=revenue_Country.sort_values(ascending=False).iloc[:3] print('Top 3 Paises con mas Ventas:') print(Top_3_Country.head(10)) print('Top 3 Paises con menos Ventas:') Top_3_Country_Low=revenue_Country.sort_values().iloc[:3] print(Top_3_Country_Low.head(10)) ```Tenemos una impresion como la siguiente: v![](https://static.platzi.com/media/user_upload/image-cfc62f7a-f99c-4a15-89f5-cc99aacaa4b5.jpg)![]()
```python # Agrupar por país y sumar las ventas sales_by_country = df.groupby('Country')['TotalPrice'].sum() # Ordenar en orden decendente y seleccionar el top 3 top_3_countries = sales_by_country.sort_values(ascending=False).head(3) print("Top 3 paises con mayor ganacias:\n",top_3_countries) # Ordenar en orden ascendente y seleccionar el top3 top_3_countries = sales_by_country.sort_values(ascending=True).head(3) print("\nTop 3 paises con menor ganacias:\n",top_3_countries) ```#   Agrupar por país y sumar las ventassales\_by\_country = df.groupby('Country')\['TotalPrice'].sum() \#   Ordenar en orden decendente y seleccionar el top 3top\_3\_countries = sales\_by\_country.sort\_values(ascending=False).head(3)print("Top 3 paises con mayor ganacias:\n",top\_3\_countries) \#   Ordenar en orden ascendente y seleccionar el top3top\_3\_countries = sales\_by\_country.sort\_values(ascending=True).head(3)print("\nTop 3 paises con menor ganacias:\n",top\_3\_countries)
\# Top 3 países con mayores ventas top\_3\_highest\_revenue = revenue\_per\_country.nlargest(3) \# Top 3 países con menores ventas top\_3\_lowest\_revenue = revenue\_per\_country.nsmallest(3) print("Top 3 países con mayores ventas:") print(top\_3\_highest\_revenue) print("\nTop 3 países con menores ventas:") print(top\_3\_lowest\_revenue)
Hola querida Carli me podrias explicar por qué queda country\_stats = df.groupby('Country')\['Quantity'] y no country\_stats = df.groupby(\['Country', \['Quantity']) , tu lo hiciste con Unit price pero ps sumar eso no dice mucho, pero la idea es entender que se puede hacer eso y es solo un ejemplo.
```python def total_revenue(group): return (group['Quantity'] * group['UnitPrice']).sum() revenue_per_country = df.groupby('Country').apply(total_revenue) print('top 3 mejores países con ventas : \n', revenue_per_country.nlargest(3)) print('top 3 peores países con ventas : \n', revenue_per_country.nsmallest(3)) top 3 mejores países con ventas : Country United Kingdom 8187806.364 Netherlands 284661.540 EIRE 263276.820 dtype: float64 top 3 peores países con ventas : Country Saudi Arabia 131.17 Bahrain 548.40 Czech Republic 707.72 dtype: float64 ```
Pues con esto pueden ver de mayor a menor que paises son los mejores compradores: def total\_revenue(group): return (group\['Quantity'] \* group\['UnitPrice']).sum() revenue\_per\_country = df.groupby('Country').apply(total\_revenue)revenue\_per\_country = revenue\_per\_country.sort\_values(ascending=False) # Ordenando los datos de forma descendenteprint('Total de ventas por cada pais: \n', revenue\_per\_country) ```js def total_revenue(group): return (group['Quantity'] * group['UnitPrice']).sum() revenue_per_country = df.groupby('Country').apply(total_revenue) revenue_per_country = revenue_per_country.sort_values(ascending=False) # Ordenando los datos de forma descendente print('Total de ventas por cada pais: \n', revenue_per_country) ```
Con la variable creada en las clases anteriores, saque el top 3 de los ingresos totales para lo más altos y más bajos. ![](https://static.platzi.com/media/user_upload/image-01968e0a-4957-45ab-97ea-fab7266bc8fc.jpg)
Use la cantidad, ya que nos piden ventas. No multiplique cantidad X precio unitario porque no nos piden ingreso total por país. ![](https://static.platzi.com/media/user_upload/image-be793bd6-a987-48fb-bbbf-21a2e4b67280.jpg)
Países con más ventas: Country United Kingdom 8,187,806.4 Netherlands 284,661.5 EIRE 263,276.8 Name: TotalPrice, dtype: object Países con menos ventas: Country Czech Republic 707.7 Bahrain 548.4 Saudi Arabia 131.2 Name: TotalPrice, dtype: object
total\_sales = df.groupby(\['Country'])\['TotalPrice'].sum().round(1) total\_sales = total\_sales.sort\_values(ascending=False) total\_sales = total\_sales.apply(lambda x: "{:,.1f}".format(x)) print("Países con más ventas:") print(total\_sales.head(3)) print("\nPaíses con menos ventas:") print(total\_sales.tail(3))
```python country_sales = df.groupby('Country')['TotalPrice'].sum() top_3_countries = country_sales.sort_values(ascending=False).head(3) bottom_3_countries = country_sales.sort_values(ascending=True).head(3) print("Top 3 países con mejores ventas:\n", top_3_countries) print("\nTop 3 países con menores ventas:\n", bottom_3_countries) ```
```python sorted_revenue = revenue_per_country.sort_values(ascending=False) top3_sales = sorted_revenue.iloc[:3] bot3_sales = sorted_revenue.iloc[-3:] print("-"*30) print(f"Top 3 paises con mas ventas: \n{top3_sales}") print("-"*30) print(f"Top 3 paises con menos ventas: \n{bot3_sales}") print("-"*30) ```
```js def total_revenue(group): return (group['Quantity'] * group['UnitPrice']).sum() revenue_per_country = df.groupby('Country').apply(total_revenue) more_sales = revenue_per_country.sort_values(ascending=False).head(3) less_sales = revenue_per_country.sort_values().head(3) print(f"paises con mejores ventas:\n, {more_sales}") print(f"paises con menores ventas.\n, {less_sales}") ```paises con mejores ventas: United Kingdom 8187806.364 Netherlands 284661.540 EIRE 263276.820 paises con menores ventas. , Country Saudi Arabia 131.17 Bahrain 548.40 Czech Republic 707.72
Aquí mi solución al reto de la clase, acepto sugerencias !! ```js total_sales = df.groupby('Country')['Quantity'].sum() ordenated_sales = total_sales.sort_values(ascending=False) top3_best_country_sales = ordenated_sales[:3] top3_worst_country_sales = total_sales.sort_values()[:3] print(f'EL TOP 3 DE MEJORES PAISES EN VENTAS ES {top3_best_country_sales}') print(f'EL TOP 3 DE PEORES PAISES EN VENTAS ES {top3_worst_country_sales}') ```
En este momento me sale este WARNING DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include\_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
```python best_countries_sales = df.groupby('Country')['Quantity'].sum().nlargest(3) print(best_countries_sales) worst_countries_sales = df.groupby('Country')['Quantity'].sum().nsmallest(3) print(worst_countries_sales) ```
top\_countries = country\_revenue.nlargest(5)print(top\_countries.head(3))
Mejores paises en ventas: `best_sales = revenue_per_country.sort_values(ascending=False)` `print(best_sales.head())` Peores paises en ventas: `worst_sales = revenue_per_country.sort_values()` `print(worst_sales.head())`
reto ```js def calcular_sells(group): return (group['Quantity'] * group['UnitPrice']).sum() ventas_max = retail_data.groupby('Country').apply(calcular_sells).sort_values(ascending=False).head(3) ventas_min = retail_data.groupby('Country').apply(calcular_sells).sort_values(ascending=False).tail(3) print('ventas maximas: \n', ventas_max) print('--------------------------------') print('ventas minimas: \n', ventas_min) ```
```python ordenamos_lista_ventas=country_revenue.sort_values(ascending=False)#ordenamos de mayor a menor print(ordenamos_lista_ventas,'\n') top3_best = ordenamos_lista_ventas.iloc[:3] # imprimmimos los 3 con mas ventas print("Los 3 países con mayores ventas: primeros en el ranking:\n", top3_best,'\n') top3_worst = ordenamos_lista_ventas.iloc[-3:] # imprimimos los 3 con menos ventas print("Los 3 países con menores ventas: últimos en el ranking:\n", top3_worst) ```ordenamos\_lista\_ventas=country\_revenue.sort\_values(ascending=False)#ordenamos de mayor a menorprint(ordenamos\_lista\_ventas,'\n') top3\_best = ordenamos\_lista\_ventas.iloc\[:3] # imprimmimos los 3 con mas ventasprint("Los 3 países con mayores ventas: primeros en el ranking:\n", top3\_best,'\n') top3\_worst = ordenamos\_lista\_ventas.iloc\[-3:] # imprimimos los 3 con menos ventasprint("Los 3 países con menores ventas: últimos en el ranking:\n", top3\_worst)
```js ``` ```java ```
No se si sea lo más eficiente pero aquí esta mi solución: ```js def total_revenue(group): return (group['Quantity'] * group['UnitPrice']).sum() revenue_per_country = df.groupby('Country').apply(total_revenue) print(revenue_per_country.sort_values(ascending=False).head(3)) print(revenue_per_country.sort_values(ascending=False).tail(3)) Country United Kingdom 8.209940e+06 Netherlands 2.846615e+05 EIRE 2.632768e+05 dtype: float64 Country Czech Republic 707.72 Bahrain 548.40 Saudi Arabia 131.17 dtype: float64 ```def total\_revenue(group): return (group\['Quantity'] \* group\['UnitPrice']).sum() revenue\_per\_country = df.groupby('Country').apply(total\_revenue)print(revenue\_per\_country.sort\_values(ascending=False).head(3))print(revenue\_per\_country.sort\_values(ascending=False).tail(3))
mi codigo para agruparr los stock code por revenue `#revenue por stockCode` `def total_rev_stockcode(group):  return (group['Quantity']*group['UnitPrice']).sum()total_revenue_by_stockcode = df.groupby('StockCode').apply(total_rev_stockcode).sort_values(ascending=False)print(total_revenue_by_stockcode.head(10))` y un buscador de StockCodes que arroje las descripciones `imput_StockCode =input('ingresa  el stock code')buscar_stockcode = df.loc[df['StockCode'] == imput_StockCode, ['StockCode','Description']]print(buscar_stockcode)`
**¿Qué es groupby?** En **Python**, el método `groupby` se utiliza en el contexto de la biblioteca pandas para agrupar datos en un **DataFrame** o **Series**. Esto permite realizar operaciones de agregación, transformación y filtrado sobre subgrupos de datos.
top\_3\_best\_sales  = revenue\_per\_country.sort\_values(ascending=False)top\_3\_worst\_sales = revenue\_per\_country.sort\_values(ascending=True) print("Top 3 best sales:",top\_3\_best\_sales)print("Top 3 best sales:",top\_3\_worst\_sales) Top 3 best sales: Country United Kingdom 8187806.364 Netherlands 284661.540 EIRE 263276.820 Top 3 worst sales: Country Saudi Arabia 131.170 Bahrain 548.400 Czech Republic 707.720 EIRE 263276.820
Mejores ventas en: United Kingdom 8187806.364 Netherlands 284661.540 EIRE 263276.820 Peores ventas en : Saudi Arabia 131.170 Bahrain 548.400 Czech Republic 707.720 codigo: def total\_revenue(group):  return (group\['Quantity']\*group\['UnitPrice']).sum() Country\_revenue=df.groupby('Country').apply(total\_revenue) x=Country\_revenue.sort\_values(ascending=False)y=Country\_revenue.sort\_values(ascending=True)print("Las mejores ventas fueron en: \n",x)print("Las peores ventas fueron en: \n",y)
Ya teniendo en cuenta la función para el revenue por país identificar los mejores tres y los peores tres es relativamente sencillo:best\_three\_countries = revenue\_by\_country.sort\_values(ascending = False).head(3)best\_three\_countries ```js best_three_countries = revenue_by_country.sort_values(ascending = False).head(3) worst_three_countries = revenue_by_country.sort_values().head(3) ```
```python #Vamos a allar los top 3 mejores paises en ventas top_3_countries = country_revenue.nlargest(3) print (top_3_countries) ``````python #ahora vamos a entcontrar los 3 peores paises en ventas bottom_3_countries = country_revenue.nsmallest(3) print (bottom_3_countries) ```
![](https://static.platzi.com/media/user_upload/image-1bd5e8ed-b6d7-4e3e-907d-fbfbc7cf3219.jpg) **Ordenación:** Ordene los resultados en orden descendente con `sort_values(ascending=False)` para que los países con mayores ventas aparezcan primero.
Construyendo sobre el aporte de Andrew.0519, a quien le agradezco: ```js country_rank = revenue_per_country.sort_values(ascending=False) top3_best = country_rank.iloc[:3] print("Los 3 países con mayores ventas: primeros en el ranking: 🏆 \n", top3_best) top3_worst = country_rank.iloc[-3:] print("Los 3 países con menores ventas: últimos en el ranking: ⚠️ \n", top3_worst) ```country\_rank = revenue\_per\_country.sort\_values(ascending=False) top3\_best = country\_rank.iloc\[:3]print("Los 3 países con mayores ventas: primeros en el ranking: 🏆 \n", top3\_best) top3\_worst = country\_rank.iloc\[-3:]print("Los 3 países con menores ventas: últimos en el ranking: ⚠️ \n", top3\_worst)
def total\_revenue(group):  return (group\['Quantity'] \* group\['UnitPrice']).sum() country\_revenue = df\_retail.groupby('Country').apply(total\_revenue) \#print(country\_revenue) rank = country\_revenue.sort\_values(ascending=False) top\_3 = rank.iloc\[:3]print('top 3')print(top\_3) worst\_3 = rank.iloc\[-3:]print('worst 3')print(worst\_3)
![](https://static.platzi.com/media/user_upload/image-e58c7fbe-6d1c-4b61-b9cb-a1301a699527.jpg)
\#   Agrupar por país y sumar las ventassales\_by\_country = df.groupby('Country')\['TotalPrice'].sum() \#   Ordenar en orden decendente y seleccionar el top 3top\_3\_countries = sales\_by\_country.sort\_values(ascending=False).head(3)print("Top 3 paises con mayor ganacias:\n",top\_3\_countries) \#   Ordenar en orden ascendente y seleccionar el top3top\_3\_countries = sales\_by\_country.sort\_values(ascending=True).head(3)print("\nTop 3 paises con menor ganacias:\n",top\_3\_countries)
```python country_sales = df.groupby('Country')['TotalPrice'].sum() top_3_countries = country_sales.sort_values(ascending=False).head(3) bottom_3_countries = country_sales.sort_values(ascending=True).head(3) print("Top 3 países con mejores ventas:\n", top_3_countries) print("\nTop 3 países con menores ventas:\n", bottom_3_countries) ```country\_sales = df.groupby('Country')\['TotalPrice'].sum()  top\_3\_countries = country\_sales.sort\_values(ascending=False).head(3)  bottom\_3\_countries = country\_sales.sort\_values(ascending=True).head(3)   print("Top 3 países con mejores ventas:\n", top\_3\_countries)print("\nTop 3 países con menores ventas:\n", bottom\_3\_countries)