pandas: Transformaciones
Los datos limpios todavía no responden preguntas de negocio. Necesitás transformarlos: crear columnas nuevas, calcular métricas, categorizar clientes, aplicar reglas. Transformar datos es el momento en que dejás de ser un técnico y empezás a generar valor para la empresa.
Concepto teórico
¿Qué es una transformación?
Una transformación es cualquier operación que toma los datos existentes y produce datos nuevos o modificados. Las operaciones más comunes en el día a día de un analista son:
- Crear columnas calculadas: "Ganancia = Ingreso - Costo"
- Mapear valores: Convertir 1/2/3 a "Bajo"/"Medio"/"Alto"
- Aplicar funciones: Aplicar una función personalizada a cada fila
- Operaciones aritméticas vectorizadas: Sumar/restar/multiplicar columnas enteras
- Renombrar columnas: Cambiar "Mnt_Brto" a "Monto_Bruto"
df["Precio"] * 1.21, pandas
aplica el cálculo a TODAS las filas simultáneamente, en una sola operación. No necesitás un bucle
for. Esto es miles de veces más rápido y es la razón por la que pandas puede procesar millones de
filas en segundos.
Crear columnas nuevas
Crear una columna nueva es tan simple como asignar un valor a un nombre de columna que no existe. Si el nombre ya existe, sobreescribe la columna.
# Columna calculada a partir de otras df["Ganancia"] = df["Ingreso"] - df["Costo"] # Columna con valor fijo df["Moneda"] = "ARS" # Columna con una operación matemática df["IVA"] = df["Monto"] * 0.21 df["Total"] = df["Monto"] + df["IVA"]
map() vs apply() vs np.where()
Tres herramientas para transformaciones más complejas:
| Método | Qué hace | Trabaja sobre | Uso típico |
|---|---|---|---|
.map(dict) |
Reemplaza valores 1-a-1 | Serie (una columna) | Codificar categorías: {"M": "Masculino"} |
.apply(func) |
Aplica función a cada elemento/fila | Serie o DataFrame | Lógica personalizada compleja |
np.where(cond, si, no) |
Asigna valor según condición | Serie/array | If/else vectorizado rápido |
map() es como un diccionario de traducción (buscás la
palabra y te da la traducción directa). apply() es como contratar un traductor humano (puede hacer
cosas complejas pero es más lento). np.where() es un semáforo: verde pasa, rojo no pasa.apply() es la más lenta de las tres porque ejecuta
la función fila por fila en Python puro. Siempre intentá usar operaciones vectorizadas (+,
*, np.where) antes de recurrir a apply(). En datasets de millones de
filas, la diferencia puede ser de segundos vs minutos.
Ejemplos explicados paso a paso
Ejemplo 1: Columnas calculadas — operaciones aritméticas
El caso más directo: crear nuevas columnas a partir de operaciones matemáticas entre columnas existentes.
Hacé clic en ▶ Ejecutar
Ejemplo 2: map() — Traducir códigos a nombres legibles
Los sistemas internos guardan datos codificados ("A", "B", "C"). Para el reporte final necesitás nombres
legibles. map() es perfecto para esto.
Hacé clic en ▶ Ejecutar
Ejemplo 3: np.where() — If/else vectorizado
Cuando necesitás clasificar con una condición simple (True/False), np.where() es más rápido y
limpio que apply().
Hacé clic en ▶ Ejecutar
Ejemplo 4: apply() — Lógica personalizada
Cuando la lógica es demasiado compleja para np.where(), definís una función Python y la aplicás a
cada fila con apply().
Hacé clic en ▶ Ejecutar
axis=0 (default) aplica la
función a cada columna. axis=1 aplica la función a cada fila. Cuando tu función necesita acceder a
varias columnas de la misma fila (como nuestro scoring), necesitás axis=1.Ejemplo 5: Renombrar, reordenar y eliminar columnas
El toque final antes de entregar un reporte: que las columnas tengan nombres profesionales y estén en orden lógico.
Hacé clic en ▶ Ejecutar
Referencia rápida
| Operación | Sintaxis | Uso |
|---|---|---|
| Crear columna calculada | df["new"] = df["a"] + df["b"] |
Operaciones aritméticas |
| Valor fijo | df["moneda"] = "ARS" |
Asignar constante a toda la columna |
| Mapear valores | df["col"].map(dict) |
Traducir códigos 1-a-1 |
| If/else vectorizado | np.where(cond, si, no) |
Clasificación binaria rápida |
| Función personalizada | df.apply(func, axis=1) |
Lógica compleja fila por fila |
| Renombrar columnas | df.rename(columns=dict) |
Nombres profesionales |
| Eliminar columnas | df.drop(columns=[...]) |
Quitar columnas temporales |
| Reordenar columnas | df[["c2","c1","c3"]] |
Orden lógico para reporte |
Ejercicios
Ejercicio 1: Crear columna calculada
Creá una columna "Total" que sea Precio * Cantidad. Imprimí la suma de Total. Debe
dar 18500.
Hacé clic en ▶ Ejecutar
Ejercicio 2: Agregar IVA
Creá columnas "IVA" (21% del precio) y "Precio_Final" (Precio + IVA). Imprimí el
Precio_Final del primer producto. Debe incluir 605.0.
Hacé clic en ▶ Ejecutar
Ejercicio 3: map() para decodificar
Usá map() para convertir la columna "Nivel" de códigos numéricos a texto:
1→"Junior", 2→"Semi", 3→"Senior". Imprimí el DataFrame. Debe incluir Senior.
Hacé clic en ▶ Ejecutar
Ejercicio 4: np.where() para clasificar
Usá np.where() para crear una columna "Rango": "Alto" si Saldo >= 500000, "Bajo" si
no. Contá cuántos son "Alto". Debe dar 3.
Hacé clic en ▶ Ejecutar
Ejercicio 5: Calcular ratio y porcentaje
Creá una columna "Ratio_Cuota" que sea Cuota / Ingreso * 100 (porcentaje). Imprimí
el ratio máximo redondeado. Debe incluir 47.
Hacé clic en ▶ Ejecutar
Ejercicio 6: Renombrar y reordenar
Renombrá "cli_nom" a "Nombre" y "cli_sal" a "Saldo".
Eliminá "tmp". Imprimí las columnas finales. Debe incluir Nombre.
Hacé clic en ▶ Ejecutar
Ejercicio 7: apply() con función personalizada
Escribí una función clasificar_saldo que reciba un número y devuelva "VIP" si >= 1M, "Premium"
si >= 500K, "Estándar" si no. Aplicala con apply(). Debe incluir VIP.
Hacé clic en ▶ Ejecutar
Ejercicio 8: apply() con axis=1 (acceso a varias columnas)
Creá una función que evalúe si un cliente es "✅ Aprobado" (score >= 650 Y ratio_cuota <= 35%) o "❌ Rechazado"
. Usá apply(func, axis=1). Debe incluir Aprobado.
Hacé clic en ▶ Ejecutar
Ejercicio 9: np.where() anidado (3 categorías)
Usá np.where() anidado para crear 3 niveles: "Alto" (>= 800K), "Medio" (>= 300K), "Bajo"
(resto). Imprimí el value_counts. Debe incluir Medio.
Hacé clic en ▶ Ejecutar
Ejercicio 10: Pipeline de transformación completo
A partir del dataset: (1) Creá columna "Ganancia" = Ingreso - Costo, (2) Creá
"Margen_%" = Ganancia/Ingreso*100, (3) Clasificá con np.where: margen >= 30 → "Rentable", else
"Ajustar", (4) Imprimí solo Producto + Margen_% + Clasificación. Debe incluir Rentable.
Hacé clic en ▶ Ejecutar
Resumen y conexión
- Crear columnas es tan simple como
df["nueva"] = expresión. - Las operaciones vectorizadas (
+,*, etc.) son rapidísimas — no usesfor. map(dict)traduce códigos a nombres legibles, 1 a 1.np.where(cond, si, no)es el if/else vectorizado más rápido.apply(func, axis=1)permite lógica compleja accediendo a varias columnas por fila.rename(),drop()y reordenamiento preparan tus datos para el reporte final.
En la siguiente lección (07 · pandas: groupby y pivot) vas a aprender a agrupar datos por categoría y calcular métricas agregadas — la herramienta preferida de todo analista para responder preguntas como "¿cuánto factura cada sucursal?" o "¿cuál es el ticket promedio por canal?".