Análisis de Ventas con Pandas: Agrupaciones y Estadísticas
Resumen
¿Cómo analizar datos de ventas utilizando Pandas?
Analizar datos de ventas puede parecer una tarea titánica, especialmente cuando hablamos de grandes volúmenes de información. Afortunadamente, Pandas, una biblioteca poderosa de Python, nos proporciona herramientas eficaces para realizar este tipo de análisis de una manera simplificada y eficaz. Hoy exploraremos cómo agrupar y analizar datos de ventas utilizando el método group by de Pandas.
¿Qué es la distribución de frecuencias y cómo se obtiene?
Obtener la distribución de frecuencias es el primer paso para entender cómo se distribuyen los datos. Para realizarlo:
Selecciona la columna de interés, como Country.
Utiliza el DataFrame para contar los valores únicos de esa columna.
Este código mostrará tanto la suma como la media del precio unitario por cada país, permitiéndote comparar los valores de una manera más detallada.
¿Cómo agrupar usando múltiples columnas?
A veces, un solo nivel de agrupación no es suficiente. Si deseas entender el comportamiento de las ventas no solo por país, sino también por stock, sigue estos pasos:
Agrupa los datos por Country y StockCode.
Calcula la suma de la cantidad para cada combinación de país y stock.
Este enfoque te mostrará el ingreso total generado por las ventas en cada país.
¿Cuál es el ejercicio para practicar y reforzar lo aprendido?
Como reto final, intenta determinar cuáles son los tres mejores y peores países en cuanto a ventas totales utilizando Pandas. Los resultados te sorprenderán y te ayudarán a entender mejor el poder del análisis de datos:
Calcula los ingresos totales.
Ordena los resultados de mayor a menor.
Extrae el top 3 de mejores y peores países.
La práctica constante con ejercicios como este te llevará a dominar Pandas, aumentando significativamente tus habilidades de análisis de datos. ¡Sigue adelante!
La lógica de GroupBy es prácticamente la misma que la de SQL.
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.364Netherlands 284661.540EIRE 263276.820dtype: float64
Los 3 países con menores ventas: últimos en el ranking: Country
Czech Republic 707.72Bahrain 548.40Saudi Arabia 131.17dtype: float64
```Los 3 países con mayores ventas: primeros en el ranking: CountryUnited Kingdom 8187806.364Netherlands 284661.540EIRE 263276.820dtype: float64
Los 3 países con menores ventas: últimos en el ranking: CountryCzech Republic 707.72Bahrain 548.40Saudi Arabia 131.17dtype: float64
Excelente gracias por tu comentario, otra forma que tambien se podría hacer es con nlargest y nsmallest:
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:
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
Ana450Juan450Pedro220Name: 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.
\# Agrupar por 'nombre' y 'ciudad' y calcular el promedio de ventas
resultado = df.groupby(\['nombre','ciudad'])\['ventas'].mean()print(resultado)
**Resultado:**
nombre ciudad  AnaMadrid225.0JuanBarcelona225.0PedroSevilla110.0Name: 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().
\# 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  Barcelona450225.0300150Madrid450225.0250200Sevilla220110.0120100
### 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.
\# Filtrar ciudades donde la suma de ventas es mayor a 300resultado = df.groupby('ciudad').filter(lambda x: x\['ventas'].sum()>300)print(resultado)
**Resultado:**
  nombre ciudad ventas anio
0AnaMadrid20020211JuanBarcelona15020213AnaMadrid25020224JuanBarcelona3002022
### 5. **Agrupación y conteo**
Si deseas contar el número de ocurrencias en cada grupo, puedes usar count() o size().
\# Contar el número de ventas por cada ciudad
resultado = df.groupby('ciudad').size()print(resultado)
**Resultado:**
ciudad
Barcelona2Madrid2Sevilla2dtype: 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.
\# 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
0AnaMadrid20020213AnaMadrid2502022Nombre:Juan  nombre ciudad ventas anio
1JuanBarcelona15020214JuanBarcelona3002022Nombre:Pedro  nombre ciudad ventas anio
2PedroSevilla10020215PedroSevilla1202022
### 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.
\# 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.
\# 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().
\# Agrupar por 'nombre' y restablecer el índice
resultado = df.groupby('nombre')\['ventas'].sum().reset\_index()print(resultado)
**Resultado:**
  nombre ventas
0Ana4501Juan4502Pedro220
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.
alguien estudiando en febrero del 2026???
Hola, yo ahora mismo.
# Revenue total por paisdeftotal_revenue(group):return(group['Quantity']* group['UnitPrice']).sum()revenue_per_country = df.groupby('Country').apply(total_revenue)# Aplica la función personalizada 'total_revenue' a cada grupo de 'Country' usando "groupby()" y "apply()"print("Revenue total por país:\n", revenue_per_country)revenue_per_country_ranked = revenue_per_country.sort_values(ascending=False)# Ordena los países por revenue total en orden descendente usando "sort_values()"print("Revenue total por país (ordenado):\n", revenue_per_country_ranked)# Extraer top 3 paises con revenue mas alto y bajotop_3_best_countries = revenue_per_country_ranked.head(3)# Extrae los top 3 países con mayor revenue usando "head()"print("Top 3 países con mayor revenue:\n", top_3_best_countries)top_3_worst_countries = revenue_per_country.sort_values().head(3)# Extrae los top 3 países con menor revenue usando "sort_values()" y "head()"print("Top 3 países con menor revenue:\n", top_3_worst_countries)
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.
# Calcular el top 3 de mejores países por ventas
top_countries = df.groupby('Country')['Quantity'].sum().nlargest(3)top_countries
``````js
CountryUnitedKingdom939682Netherlands44187EIRE27191dtype: int64
``````js
# Calcular el top 3 de peores países por ventas
worst_countries = df.groupby('Country')['Quantity'].sum().nsmallest(3)worst_countries
``````js
CountryBahrain0SaudiArabia75Canada88dtype: int64
que es el js aquí en tu programa. saludos
En este caso es un error, acá no debí copiar el código markdown del notebook directo porque crea la confusión.
En Markdown para denotar código Python debería ser:
```python
Código de python
```
```python
...
```
```js : la triple comilla y el nombre del lenguaje (js) se utiliza en Markdown para darle formato a lo que escribes y que se vea como código.
Cuando copié y pegué el código desde el navegador, en la ventana del comentario no me di cuenta que estaba marcado como JavaScript. (js)
Es decir, ejecuté el código Python en el Notebook y como estamos en un navegador web, la respuesta o tabla que me carga abajo viene como JavaScript. (js), por esa razón al copiarlo viene como (JS).
En este caso no afecta el resultado, pero por ejemplo si usas diagramas Mermaid para documentar procesos, es obligatorio poner el nombre correcto o no te renderea el diagrama. Ej:
```js
# Resultado:
Country
Bahrain 0
Saudi Arabia 75
Canada 88
dtype: int64
```
Gracias por preguntar y saludos.
Creo que esta es la forma mas sencilla que he visto en los comentarios, solo organizar la lista y decirle que muestre los 3 primeros.
💻 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).
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
Como complemento a lo anterior, también podemos abstraer el resultado del agrupamiento a una variable y a partir de allí sacar el top 3 mejores y peores ventas por país.
# Abstracción del agrupamientogruped_sales_per_country =( retail_df
.groupby("Country").apply(lambda x:(x["Quantity"]* x["UnitPrice"]).sum()))# Forma #1 top_3_best_sales = gruped_sales_per_country.sort_values(ascending=False).head(3)top_3_worst_sales = gruped_sales_per_country.sort_values(ascending=True).head(3)print("Forma #1 ")print(top_3_best_sales)print(top_3_worst_sales)# Forma #2: top_3_best_sales = gruped_sales_per_country.nlargest(3)top_3_worst_sales = gruped_sales_per_country.nsmallest(3)print("Forma #2 ")print(top_3_best_sales)print(top_3_worst_sales)
Incluso en el primer ejemplo donde se aplica el ordenamiento lo podemos abstraer aun más
# Abstracción del agrupamientogruped_sales_per_country =( retail_df
.groupby("Country").apply(lambda x:(x["Quantity"]* x["UnitPrice"]).sum()).sort_values(ascending=False))top_3_best_sales = gruped_sales_per_country.head(3)# Primeros 3top_3_worst_sales = gruped_sales_per_country.tail(3)# Ultimos 3
Esta es mi respuesta al ejercicio:
# analisis de total de ventas (revenue) por cada paistotal_revenue =lambda x:(x['Quantity']* x['UnitPrice']).sum()country_revenue =( df_retail_data
.groupby('Country')[['Quantity','UnitPrice']].apply(total_revenue).sort_values(ascending=False))print(f'Top 3 countries with the highest sales:\n {country_revenue.head(3)}')print(f'\nTop 3 countries with the lowest sales:\n {country_revenue.tail(3)}')
MOdelo coworcountry o modelo coworculture con muchas actividades para pausas activas y acompañamiento de tu rol profesional Recuerda que Estamos enfocados en atender y brindar espacios para nomadas digitales, teletrabajo y coworking space en Agrolenials Paradise Ecohostel Country Inns contacto directo whatsapp +573206299333 y Faccebook
El método groupby() de Pandas es una herramienta esencial para el análisis de datos que permite agrupar filas de un DataFrame basándose en valores compartidos en una o más columnas. Funciona bajo el principio de "Dividir - Aplicar - Combinar".
Dividir: Los datos se separan en grupos según una clave o criterio.
Aplicar: Se ejecuta una función sobre cada grupo (como una suma, promedio o conteo).
Combinar: Los resultados de esas operaciones se reúnen en una nueva estructura de datos
!GroupBy Python Function & How To Use It! | Board Infinity
top_3_countries = revenue_per_country.nlargest(3)print("Top 3 países por ventas:")print(top_3_countries)
smallest_3_countries = revenue_per_country.nsmallest(3)print("\nPeores 3 países por ventas:")print(smallest_3_countries)