Agrupación y Agregación en Pandas

PandasBeginner
Practicar Ahora

Introducción

Agrupar y agregar datos son operaciones fundamentales en el análisis de datos. Permiten dividir un conjunto de datos grande en grupos más pequeños basándose en ciertos criterios y luego calcular estadísticas resumidas para cada grupo. Este proceso es esencial para descubrir patrones, comparar segmentos y obtener información significativa a partir de datos brutos.

En la biblioteca de análisis de datos de Python, Pandas, esta estrategia de "dividir-aplicar-combinar" se maneja principalmente mediante el potente método groupby(). En este laboratorio, aprenderá a utilizar groupby() para realizar agrupaciones y agregaciones. Comenzará agrupando datos por una sola columna, aplicará funciones de agregación, utilizará múltiples funciones a la vez, agrupará por múltiples columnas y, finalmente, formateará la salida en un DataFrame estándar.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 91%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Agrupar por una sola columna usando groupby

En este paso, aprenderá el uso básico del método groupby() para dividir un DataFrame en grupos. El método groupby() en sí mismo no calcula nada, sino que devuelve un objeto DataFrameGroupBy. Este objeto contiene toda la información necesaria para luego aplicar cálculos a cada grupo.

Primero, agruparemos nuestro DataFrame de ejemplo por la columna Category. Esto creará grupos distintos para 'Electronics', 'Clothing' y 'Books'.

Abra el archivo main.py en el editor de la izquierda. El código inicial para crear un DataFrame ya está allí. Agregue el siguiente código al final del archivo main.py:

## Agrupar por la columna 'Category'
grouped_by_category = df.groupby('Category')

## El resultado es un objeto DataFrameGroupBy
print("Tipo del objeto agrupado:")
print(type(grouped_by_category))

## Para ver el contenido, puede iterar sobre los grupos
print("\nIterando sobre los grupos para ver su contenido:")
for name, group in grouped_by_category:
    print(f"\nGrupo: {name}")
    print(group)

Ahora, ejecute el script desde la terminal para ver la salida.

python3 main.py

Verá el DataFrame original, seguido del tipo del objeto groupby, y luego el contenido de cada grupo. Esto demuestra que el DataFrame se ha dividido con éxito basándose en los valores únicos de la columna 'Category'.

Original DataFrame:
      Category Region  Sales  Units
0  Electronics  North   1200     10
1     Clothing  South    800     25
2  Electronics  North   1500      8
3        Books   West    300     15
4     Clothing   East    900     20
5        Books   West    450     18

==============================

Type of the grouped object:
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>

Iterating over groups to see their content:

Group: Books
  Category Region  Sales  Units
3    Books   West    300     15
5    Books   West    450     18

Group: Clothing
   Category Region  Sales  Units
1  Clothing  South    800     25
4  Clothing   East    900     20

Group: Electronics
      Category Region  Sales  Units
0  Electronics  North   1200     10
2  Electronics  North   1500      8

Aplicar agregación de suma en grupos

En este paso, aprenderá cómo aplicar una función de agregación a los grupos que ha creado. Después de agrupar los datos, el siguiente paso más común es realizar un cálculo, como sum(), mean(), count(), o max(), en cada grupo.

Calculemos las ventas totales para cada categoría de producto. Para hacer esto, primero agrupe por Category y luego seleccione la columna Sales para aplicar la función sum().

Agregue el siguiente código al final de su archivo main.py. Puede eliminar el bucle for del paso anterior para mantener la salida limpia.

## Agrupar por 'Category' y calcular la suma de 'Sales' para cada grupo
category_sales_sum = df.groupby('Category')['Sales'].sum()

print("Ventas totales por categoría:")
print(category_sales_sum)

Guarde el archivo y ejecútelo de nuevo.

python3 main.py

La salida ahora mostrará una Serie de Pandas donde el índice es el nombre de la categoría y los valores son las ventas totales para esa categoría.

... (salida anterior) ...

Total sales per category:
Category
Books           750
Clothing       1700
Electronics    2700
Name: Sales, dtype: int64

Esta es una forma potente y concisa de resumir sus datos. Puede aplicar la misma lógica a otras columnas numéricas o utilizar otras funciones de agregación como mean() para encontrar el promedio.

Agregar múltiples funciones con agg

En este paso, aprenderá cómo aplicar múltiples funciones de agregación a sus grupos simultáneamente utilizando el método agg(). Esto es muy útil cuando desea calcular varias estadísticas de resumen a la vez, como el total y el promedio de ventas.

Al método agg() se le puede pasar una lista de cadenas, donde cada cadena es el nombre de una función de agregación. Calculemos tanto la sum (suma) como la mean (media) de Sales para cada Category.

Agregue el siguiente código al final de su archivo main.py:

## Agrupar por 'Category' y aplicar múltiples agregaciones en 'Sales'
category_agg = df.groupby('Category')['Sales'].agg(['sum', 'mean'])

print("\nSuma y media de ventas por categoría:")
print(category_agg)

Guarde el archivo y ejecútelo.

python3 main.py

La salida es ahora un DataFrame. El índice sigue siendo la Category, pero las columnas son jerárquicas, mostrando tanto la sum como la mean para los datos de Sales.

... (salida anterior) ...

Sum and mean of sales per category:
              sum    mean
Category
Books         750   375.0
Clothing     1700   850.0
Electronics  2700  1350.0

El método agg() proporciona una forma flexible de generar resúmenes completos de sus datos agrupados.

Agrupar por múltiples columnas

En este paso, aprenderá cómo agrupar un DataFrame por más de una columna. Esto es útil para crear grupos más granulares y analizar las interacciones entre diferentes categorías. Para hacer esto, simplemente pase una lista de nombres de columnas al método groupby().

Encontremos las ventas totales para cada combinación de Region y Category. Esto nos mostrará cómo se distribuyen las ventas de diferentes categorías de productos en las regiones.

Agregue el siguiente código al final de su archivo main.py:

## Agrupar por múltiples columnas: 'Region' y 'Category'
multi_group_sum = df.groupby(['Region', 'Category'])['Sales'].sum()

print("\nVentas totales por Región y Categoría:")
print(multi_group_sum)

Guarde el archivo y ejecute el script.

python3 main.py

La salida tendrá un MultiIndex en las filas, con el primer nivel siendo Region y el segundo nivel siendo Category. Esto proporciona un desglose detallado de las ventas.

... (salida anterior) ...

Total sales per Region and Category:
Region  Category
East    Clothing        900
North   Electronics    2700
South   Clothing        800
West    Books           750
Name: Sales, dtype: int64

Como puede ver, agrupar por múltiples columnas permite un análisis más profundo y jerárquico de su conjunto de datos.

Restablecer índice en DataFrame agrupado

En este paso, aprenderá cómo convertir la salida agrupada de nuevo en un DataFrame regular, donde las claves de agrupación son columnas en lugar del índice. Por defecto, groupby() convierte las claves de agrupación en el índice de la Serie o DataFrame resultante. A veces, desea un DataFrame "plano" para su posterior procesamiento o visualización.

La forma más sencilla de lograr esto es utilizando el parámetro as_index=False dentro del método groupby().

Repitamos la agrupación de una sola columna del Paso 2, pero esta vez mantendremos Category como una columna regular.

Agregue el siguiente código al final de su archivo main.py:

## Agrupar por 'Category' y agregar, pero mantener 'Category' como una columna
category_sales_flat = df.groupby('Category', as_index=False)['Sales'].sum()

print("\nDatos agrupados con 'Category' como una columna:")
print(category_sales_flat)

Guarde el archivo y ejecútelo por última vez.

python3 main.py

Observe la salida. En lugar de que Category sea el índice, ahora es la primera columna de un nuevo DataFrame, y el DataFrame tiene un índice entero estándar (0, 1, 2).

... (salida anterior) ...

Grouped data with 'Category' as a column:
      Category  Sales
0        Books    750
1     Clothing   1700
2  Electronics   2700

Este formato suele ser más conveniente para tareas posteriores de manipulación de datos. Un método alternativo es llamar a .reset_index() en el resultado agrupado, lo que logra el mismo resultado.

Resumen

¡Felicitaciones por completar este laboratorio sobre agrupación y agregación con Pandas! Ha aprendido una de las características más potentes y comúnmente utilizadas de la biblioteca Pandas para el análisis de datos.

En este laboratorio, practicó:

  • Dividir un DataFrame en grupos usando df.groupby('nombre_columna').
  • Aplicar una única función de agregación como .sum() a los grupos.
  • Usar el método .agg() para aplicar múltiples funciones de agregación a la vez.
  • Agrupar por múltiples columnas para crear un resumen jerárquico usando df.groupby(['col1', 'col2']).
  • Crear un DataFrame plano a partir de una operación groupby usando el parámetro as_index=False.

Dominar estas técnicas es un paso crucial para ser competente en la manipulación y el análisis de datos con Python y Pandas.