14. Ejercicios prácticos en Pandas

En esta sección aplicamos lo visto: limpieza de datos, análisis agrupado y un mini-proyecto. Usaremos Pandas junto a NumPy y Seaborn.

14.1 Limpieza de un dataset con datos faltantes

Enunciado: Recibís un DataFrame de clientes con edades, ciudades y compras en el que aparecen valores nulos (NaN/None). Tu objetivo es dejarlo listo para un análisis posterior.

  1. Detectá cuántos valores faltantes tiene cada columna.
  2. Conservá solo las filas que tengan al menos tres datos válidos.
  3. Imputá los faltantes restantes usando estadísticos simples (media, mediana o valores fijos según corresponda).

Intentá resolverlo sin mirar el código que sigue y luego compará tu enfoque con la solución propuesta.

import pandas as pd
datos = {
    "Cliente": ["Ana", "Luis", "Carla", "Pedro", "María"],
    "Edad": [23, None, 29, 42, None],
    "Ciudad": ["Córdoba", "Buenos Aires", None, "Mendoza", "Salta"],
    "Compras": [5, 8, None, 12, 7]
}
df = pd.DataFrame(datos)
print("Dataset original:")
print(df)
print()
print("Valores nulos por columna:")
print(df.isnull().sum())
df1 = df.dropna(thresh=3).copy()  # conserva filas con al menos 3 valores válidos
df1.loc[:, "Edad"] = df1["Edad"].fillna(df1["Edad"].mean())
df1.loc[:, "Ciudad"] = df1["Ciudad"].fillna("Desconocida")
df1.loc[:, "Compras"] = df1["Compras"].fillna(df1["Compras"].median())
print()
print("Dataset limpio:")
print(df1)
👉 Detectá nulos, filtrá filas incompletas e imputá los valores restantes para preparar los datos.

14.2 Análisis de ventas con agrupaciones

Enunciado: A partir de un registro de ventas por región y producto, generá indicadores que resuman el desempeño comercial.

  1. Calculá los ingresos totales por región.
  2. Obtené el promedio de ingresos por producto.
  3. Armá una tabla resumen con sumas y promedios de unidades, y sumas y máximos de ingresos por región y producto.

Intentá resolverlo sin mirar el código y luego compará tu resultado con la solución propuesta.

Calculamos ingresos, sumas y promedios usando groupby y agg.

import pandas as pd
ventas = pd.DataFrame({
    "Región": ["Norte", "Norte", "Sur", "Sur", "Norte", "Sur"],
    "Producto": ["A", "B", "A", "B", "A", "B"],
    "Unidades": [10, 15, 20, 25, 5, 30],
    "Precio": [100, 200, 100, 200, 100, 200]
})
ventas["Ingresos"] = ventas["Unidades"] * ventas["Precio"]
print("Dataset de ventas:")
print(ventas)
print()
print("Ventas totales por región:")
print(ventas.groupby("Región")["Ingresos"].sum())
print()
print("Promedio de ingresos por producto:")
print(ventas.groupby("Producto")["Ingresos"].mean())
print()
print("Estadísticas por región y producto:")
print(ventas.groupby(["Región", "Producto"]).agg({
    "Unidades": ["sum", "mean"],
    "Ingresos": ["sum", "max"]
}))
👉 Agrupar primero y agregar después te permite crear reportes resumidos con pocas líneas.

14.3 Mini-proyecto: Titanic con Pandas

Enunciado: Trabajá con el dataset Titanic para realizar un análisis exploratorio corto.

  1. Inspeccioná la estructura y los estadísticos básicos del conjunto.
  2. Limpia las columnas con faltantes clave (edad y puerto de embarque) usando imputaciones simples.
  3. Calculá tasas de supervivencia por sexo, clase y condición de niño/adulto.
  4. Mostrá la distribución de edades con un histograma para detectar patrones.

Intentá resolverlo sin ver la solución y después contrastá con el ejemplo.

El clásico dataset Titanic, disponible en Seaborn, es perfecto para un EDA completo.

Antes de comenzar, instalá seaborn si todavía no lo tenés disponible:

pip install seaborn

La función sns.load_dataset("titanic") descarga una versión preprocesada del dataset histórico con información de pasajeros (edad, sexo, clase, tarifa, puerto de embarque, etc.), lista para usarse sin descargas adicionales.

import seaborn as sns
import matplotlib.pyplot as plt
titanic = sns.load_dataset("titanic").copy()
print(titanic.head())
print(titanic.info())
print(titanic.describe())
titanic["age"] = titanic["age"].fillna(titanic["age"].mean())
titanic["embarked"] = titanic["embarked"].fillna("S")
titanic["is_child"] = titanic["age"] < 18
print()
print("Supervivencia por sexo:")
print(titanic.groupby("sex", observed=False)["survived"].mean())
print()
print("Supervivencia por clase:")
print(titanic.groupby("class", observed=False)["survived"].mean())
print()
print("Supervivencia por niños vs adultos:")
print(titanic.groupby("is_child", observed=False)["survived"].mean())
ax = titanic["age"].plot(kind="hist", bins=20, title="Distribución de edades en el Titanic")
ax.set_xlabel("Edad")
plt.show()
💡 En pocas líneas cubrís limpieza, estadísticas, comparaciones y una visualización inicial.

Resumen del tema 14

  • Limpieza de faltantes con dropna, fillna y estadísticos simples.
  • Análisis de ventas combinando groupby, agregaciones y cálculos derivados.
  • Mini-proyecto Titanic: limpieza, agrupaciones, indicadores y gráfico exploratorio.