QuieroProgramar por Rodri Gonzalez
Data Analysis · Lección 06 de 19

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.

90–120 min Prerrequisitos: Lección 05 (Limpieza)
01

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:

Principio clave: las operaciones en pandas son vectorizadas. Esto significa que cuando escribís 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
Analogía: 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.
Performance: 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.
02

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.

ejemplo_01_columnas_calc.pyPython

        
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.

ejemplo_02_map.pyPython

        
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().

ejemplo_03_npwhere.pyPython

        
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().

ejemplo_04_apply.pyPython

        
Hacé clic en ▶ Ejecutar
Tip profesional — axis=0 vs axis=1: 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.

ejemplo_05_renombrar.pyPython

        
Hacé clic en ▶ Ejecutar
03

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
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: Crear columna calculada

Creá una columna "Total" que sea Precio * Cantidad. Imprimí la suma de Total. Debe dar 18500.

ejercicio_01.pyDebe incluir "18500"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

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.

ejercicio_02.pyDebe incluir "605.0"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

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.

ejercicio_03.pyDebe incluir "Senior"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

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.

ejercicio_04.pyDebe incluir "3"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

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.

ejercicio_05.pyDebe incluir "47"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: Renombrar y reordenar

Renombrá "cli_nom" a "Nombre" y "cli_sal" a "Saldo". Eliminá "tmp". Imprimí las columnas finales. Debe incluir Nombre.

ejercicio_06.pyDebe incluir "Nombre"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_07.pyDebe incluir "VIP"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_08.pyDebe incluir "Aprobado"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_09.pyDebe incluir "Medio"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

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.

ejercicio_10_desafio.pyDebe incluir "Rentable"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

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?".

Recursos: pandas docs — Essential Basic Functionality