Lección 9 de 36Transformar con Power Query

Limpieza de datos: nulls, duplicados, tipos

Técnicas esenciales para datos limpios y consistentes.

20 minutos

Los datos reales rara vez vienen perfectos. Duplicados, errores, formatos inconsistentes y valores faltantes son la norma. En esta lección aprenderás las técnicas esenciales de Power Query para transformar datos sucios en información confiable.

Por qué es crítico limpiar datos

El costo de datos sucios

Problema Impacto en el negocio
Duplicados Sobreestimación de métricas (ventas, clientes)
Valores nulos Cálculos incorrectos, visualizaciones engañosas
Formatos inconsistentes Imposibilidad de agrupar o filtrar correctamente
Tipos de datos erróneos Operaciones no permitidas, rendimiento lento
Errores sin manejar Fallos al refrescar datos, reportes incompletos

Regla fundamental: El 80% del trabajo de un analista de datos es limpiar y preparar información. Power Query hace este proceso eficiente y reproducible.

1. Quitar Filas No Deseadas

Quitar filas superiores

Útil cuando los archivos tienen encabezados o notas al inicio:

  1. Ve a Inicio > Quitar filas > Quitar filas superiores
  2. Especifica cuántas filas eliminar (ejemplo: 3)
  3. Las primeras 3 filas desaparecen

Código M generado:

= Table.Skip(#"Paso anterior", 3)

Caso de uso: Archivos Excel con títulos, fechas de exportación o logos en las primeras filas.

Quitar filas inferiores

Para eliminar totales o notas al final:

  1. Inicio > Quitar filas > Quitar filas inferiores
  2. Indica el número de filas (ejemplo: 2)

Código M:

= Table.RemoveLastN(#"Paso anterior", 2)

Quitar filas alternativas

Útil con datos exportados con filas de espaciado:

  1. Inicio > Quitar filas > Quitar filas alternativas
  2. Configura:
    • Primera fila para quitar: 2
    • Número de filas para quitar: 1
    • Número de filas para mantener: 1

Resultado: Elimina cada segunda fila, manteniendo solo las impares.

Quitar duplicados

La transformación más común para garantizar unicidad:

Opción 1: Quitar duplicados en toda la tabla

  1. Selecciona todas las columnas (Ctrl+A)
  2. Inicio > Quitar filas > Quitar duplicados
  3. Se mantiene la primera ocurrencia de cada combinación única

Opción 2: Quitar duplicados basándose en columnas específicas

  1. Selecciona solo las columnas relevantes (ejemplo: ClienteID, Fecha)
  2. Inicio > Quitar duplicados
  3. Se evalúa duplicación solo en esas columnas

Código M:

// Quitar duplicados en toda la tabla
= Table.Distinct(#"Paso anterior")

// Quitar duplicados por columnas específicas
= Table.Distinct(#"Paso anterior", {"ClienteID", "Fecha"})

Advertencia: Asegúrate de seleccionar las columnas correctas. Si solo seleccionas "Nombre", podrías eliminar clientes diferentes que comparten el mismo nombre.

Mantener solo filas únicas

Hace lo contrario: solo conserva filas que NO tienen duplicados:

  1. Selecciona columnas de referencia
  2. Inicio > Quitar filas > Mantener filas únicas

Caso de uso: Identificar transacciones que solo ocurrieron una vez.

2. Quitar Columnas Innecesarias

Reducir columnas mejora el rendimiento y la claridad:

Quitar columnas individualmente

  1. Clic derecho en el encabezado de la columna
  2. Quitar

Código M:

= Table.RemoveColumns(#"Paso anterior", {"Columna1", "Columna2"})

Quitar otras columnas

Cuando quieres MANTENER solo algunas columnas:

  1. Selecciona las columnas a conservar (Ctrl+clic)
  2. Clic derecho > Quitar otras columnas

Código M:

= Table.SelectColumns(#"Paso anterior", {"ClienteID", "Nombre", "Ventas"})

Tip: Usa "Quitar otras columnas" en lugar de quitar una por una. Es más eficiente y el código es más limpio.

Quitar columnas vacías

Para eliminar todas las columnas sin datos:

  1. Clic derecho en cualquier encabezado
  2. Quitar columnas > Quitar columnas vacías

Código M:

= Table.RemoveColumns(#"Paso anterior", List.Select(Table.ColumnNames(#"Paso anterior"), each List.NonNullCount(Table.Column(#"Paso anterior", _)) = 0))

3. Manejar Valores Nulos y Errores

Identificar valores nulos

Activa las vistas de calidad de datos:

  1. Ve a Vista > marca Calidad de columna
  2. Ve a Vista > marca Distribución de columna
  3. Aparecen barras sobre cada columna mostrando:
    • % de valores válidos (verde)
    • % de errores (rojo)
    • % de valores vacíos (gris)

Filtrar valores nulos

Para eliminar filas con valores faltantes:

  1. Haz clic en el filtro de la columna (triángulo junto al nombre)
  2. Desmarca (null)
  3. Aceptar

Código M:

= Table.SelectRows(#"Paso anterior", each [Columna] <> null)

Reemplazar valores nulos

Para sustituir nulos por un valor predeterminado:

  1. Clic derecho en la columna con nulos
  2. Reemplazar valores
  3. Valor que buscar: (dejar en blanco)
  4. Reemplazar con: 0 (o el valor deseado)
  5. Aceptar

Código M:

= Table.ReplaceValue(#"Paso anterior", null, 0, Replacer.ReplaceValue, {"Ventas"})

Estrategias comunes:

  • Valores numéricos: Reemplazar por 0 o promedio de la columna
  • Texto: Reemplazar por "No especificado" o "N/A"
  • Fechas: Considerar eliminar la fila si la fecha es crítica

Rellenar hacia arriba / abajo

Útil con datos agrupados donde la categoría aparece solo en la primera fila:

Ejemplo de datos:

Categoría    | Producto
-------------|----------
Electrónica  | Laptop
             | Mouse
             | Teclado
Hogar        | Silla
             | Mesa

Para rellenar hacia abajo:

  1. Selecciona la columna Categoría
  2. Transformar > Rellenar > Abajo
  3. Los valores se copian hacia las filas vacías inferiores

Código M:

= Table.FillDown(#"Paso anterior", {"Categoría"})

Para rellenar hacia arriba:

  • Útil cuando el total aparece antes de los detalles
  • Transformar > Rellenar > Arriba

Código M:

= Table.FillUp(#"Paso anterior", {"Total"})

Quitar errores

Para eliminar filas con errores de cálculo:

  1. Clic en el filtro de la columna
  2. Desmarca Error
  3. Aceptar

O bien:

  1. Clic derecho en la columna con errores
  2. Quitar errores

Código M:

= Table.RemoveRowsWithErrors(#"Paso anterior", {"Columna"})

Reemplazar errores

Para sustituir errores por un valor:

  1. Clic derecho en la columna con errores
  2. Reemplazar errores
  3. Valor: 0 o "Error detectado"
  4. Aceptar

Código M:

= Table.ReplaceErrorValues(#"Paso anterior", {{"Columna", 0}})

Buena práctica: Investiga la causa de los errores antes de ocultarlos. Pueden indicar problemas en la fuente de datos o tipos incorrectos.

4. Tipos de Datos

El tipo de dato correcto es fundamental para cálculos y rendimiento.

Tipos de datos disponibles

Tipo Icono Uso Ejemplo
Texto ABC Nombres, descripciones "Juan Pérez"
Número entero 123 Contadores, IDs 42
Número decimal 1.2 Precios, porcentajes 19.99
Fecha 📅 Solo fecha, sin hora 2026-01-27
Fecha/hora 🕐 Timestamp completo 2026-01-27 10:30:00
Hora Solo hora del día 14:30:00
True/False ✓✗ Banderas, estados TRUE
Porcentaje % Tasas, ratios 0.15 (mostrado como 15%)
Moneda 💲 Valores monetarios $1,234.56

Cambiar tipo de dato

Método 1: Desde el icono de tipo

  1. Haz clic en el icono junto al nombre de columna (ABC, 123, etc.)
  2. Selecciona el nuevo tipo de la lista

Método 2: Desde la cinta

  1. Selecciona la columna
  2. Transformar > Tipo de datos > Selecciona el tipo

Método 3: Detectar automáticamente

  1. Selecciona múltiples columnas
  2. Transformar > Detectar tipo de datos
  3. Power Query analiza los valores y asigna el tipo más apropiado

Código M:

= Table.TransformColumnTypes(#"Paso anterior", {
    {"ClienteID", Int64.Type},
    {"Nombre", type text},
    {"FechaVenta", type date},
    {"Monto", type number}
})

Errores comunes con tipos

Problema 1: Números almacenados como texto

  • Síntoma: No puedes sumar, la columna se alinea a la izquierda
  • Solución: Cambiar a Número entero o Número decimal
  • Código: = Table.TransformColumnTypes(..., {{"Columna", type number}})

Problema 2: Fechas como texto

  • Síntoma: No puedes filtrar por mes/año, ordenamiento incorrecto
  • Solución: Cambiar a tipo Fecha
  • Advertencia: Verifica el formato (DD/MM/YYYY vs MM/DD/YYYY)

Problema 3: Decimales truncados

  • Síntoma: 19.99 se muestra como 20
  • Solución: Cambiar de Número entero a Número decimal

Problema 4: Errores al cambiar tipo

  • Síntoma: Aparecen filas con "Error" después de cambiar tipo
  • Causa: Valores no convertibles (ejemplo: "N/A" en columna numérica)
  • Solución: Limpiar valores inválidos antes de cambiar tipo

5. Transformaciones de Texto

Cambiar formato de capitalización

Transformación Resultado Uso
MAYÚSCULAS "JUAN PÉREZ" Códigos, identificadores
minúsculas "juan pérez" Emails, URLs
Poner en mayúsculas cada palabra "Juan Pérez" Nombres propios

Cómo aplicar:

  1. Selecciona columna de texto
  2. Transformar > Formato > Selecciona formato
  3. Cambia directamente el contenido

Código M:

// Mayúsculas
= Table.TransformColumns(#"Paso anterior", {{"Nombre", Text.Upper, type text}})

// Minúsculas
= Table.TransformColumns(#"Paso anterior", {{"Email", Text.Lower, type text}})

// Capitalizar palabras
= Table.TransformColumns(#"Paso anterior", {{"Nombre", Text.Proper, type text}})

Limpiar espacios

Recortar: Elimina espacios al inicio y final

  1. Selecciona columna
  2. Transformar > Formato > Recortar

Código M:

= Table.TransformColumns(#"Paso anterior", {{"Columna", Text.Trim, type text}})

Limpiar: Elimina espacios extra entre palabras

  1. Transformar > Formato > Limpiar
  2. Convierte múltiples espacios en uno solo

Código M:

= Table.TransformColumns(#"Paso anterior", {{"Columna", Text.Clean, type text}})

Tip: Aplica siempre Recortar + Limpiar en columnas de texto provenientes de entrada manual. Los espacios invisibles son una fuente común de errores.

Reemplazar valores

Para corregir errores recurrentes o estandarizar:

  1. Clic derecho en la columna
  2. Reemplazar valores
  3. Valor que buscar: Cdmx
  4. Reemplazar con: Ciudad de México
  5. Aceptar

Opciones avanzadas:

  • Coincidir con el uso de mayúsculas y minúsculas: Busca exactamente como escribes
  • Coincidir con el contenido completo de la celda: No busca dentro del texto, solo celdas completas

Código M:

= Table.ReplaceValue(
    #"Paso anterior",
    "Cdmx",
    "Ciudad de México",
    Replacer.ReplaceText,
    {"Ciudad"}
)

Reemplazos múltiples:

= Table.ReplaceValue(#"Paso anterior", "Cdmx", "CDMX", Replacer.ReplaceText, {"Ciudad"})
= Table.ReplaceValue(#"Paso anterior", "Mex", "México", Replacer.ReplaceText, {"País"})

Dividir columna

Por delimitador:

  1. Selecciona columna con múltiples valores (ej: "Apellido, Nombre")
  2. Transformar > Dividir columna > Por delimitador
  3. Selecciona delimitador: , o --Personalizado--
  4. Dividir en: Cada repetición del delimitador
  5. Aceptar

Resultado: Crea columnas "Columna.1", "Columna.2", etc.

Código M:

= Table.SplitColumn(
    #"Paso anterior",
    "NombreCompleto",
    Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv),
    {"Apellido", "Nombre"}
)

Por número de caracteres:

  • Útil para códigos con estructura fija (ej: "20260127-001")
  • Transformar > Dividir columna > Por número de caracteres
  • Especifica posiciones

Por posición:

  • Para separar en posiciones específicas
  • Transformar > Dividir columna > Por posiciones

Combinar columnas

Para unir valores de múltiples columnas:

  1. Selecciona columnas a combinar (Ctrl+clic): "Nombre" y "Apellido"
  2. Transformar > Combinar columnas
  3. Separador: Espacio (o personalizado como ", ")
  4. Nuevo nombre de columna: NombreCompleto
  5. Aceptar

Código M:

= Table.CombineColumns(
    #"Paso anterior",
    {"Nombre", "Apellido"},
    Combiner.CombineTextByDelimiter(" ", QuoteStyle.None),
    "NombreCompleto"
)

Extraer texto

Primeros caracteres:

  1. Transformar > Extraer > Primeros caracteres
  2. Cuenta: 3
  3. Crea nueva columna con los primeros 3 caracteres

Últimos caracteres:

  • Útil para extraer extensiones de archivo

Rango:

  • Desde posición X, extraer Y caracteres
  • Ejemplo: De "2026-01-27", extraer año (posición 0, longitud 4)

Texto antes del delimitador:

  • Todo el texto antes de la primera ocurrencia de "@" (para obtener usuario de email)

Texto después del delimitador:

  • Todo el texto después de la última "/" (para obtener nombre de archivo de una ruta)

Código M:

// Primeros 3 caracteres
= Table.TransformColumns(#"Paso anterior", {{"Código", each Text.Start(_, 3), type text}})

// Últimos 4 caracteres
= Table.TransformColumns(#"Paso anterior", {{"Archivo", each Text.End(_, 4), type text}})

6. Ejercicio Práctico Completo

Vamos a limpiar un conjunto de datos realista con múltiples problemas.

Datos de entrada (simulados)

Imagina una exportación de ventas con estos problemas:

  • Primeras 2 filas son encabezados de sistema
  • Espacios extra en nombres
  • Formatos de fecha inconsistentes
  • Montos como texto
  • Duplicados
  • Columnas innecesarias

Paso a paso

  1. Crear datos de ejemplo

En el Editor avanzado, pega:

let
    Origen = Table.FromRows(
        {
            {"FECHA", "CLIENTE", "  MONTO  ", "CATEGORÍA", "INTERNO"},
            {"Exportado: 27-01-2026", "", "", "", ""},
            {"27/01/2026", "  Juan Pérez  ", "1,500", "Electrónica", "X001"},
            {"28-01-2026", "ANA LÓPEZ", "2500", "Hogar", "X002"},
            {"27/01/2026", "  Juan Pérez  ", "1,500", "Electrónica", "X001"},
            {"29/01/2026", "María García", "N/A", "Electrónica", "X003"}
        },
        type table [Col1 = text, Col2 = text, Col3 = text, Col4 = text, Col5 = text]
    )
in
    Origen
  1. Quitar filas de encabezado extra

    • Inicio > Quitar filas > Quitar filas superiores > 2
    • Elimina las filas de sistema
  2. Promover primera fila a encabezados

    • Inicio > Usar primera fila como encabezados
    • Ahora tienes columnas: FECHA, CLIENTE, MONTO, CATEGORÍA, INTERNO
  3. Quitar columna innecesaria

    • Clic derecho en "INTERNO" > Quitar
  4. Limpiar nombres de columnas

    • Doble clic en " MONTO " > Escribe "Monto"
    • Repite para normalizar nombres
  5. Limpiar espacios en CLIENTE

    • Selecciona columna CLIENTE
    • Transformar > Formato > Recortar
    • Transformar > Formato > Poner en mayúsculas cada palabra
  6. Limpiar columna Monto

    • Reemplazar valores: "," por "" (eliminar comas)
    • Reemplazar valores: "N/A" por "0"
    • Cambiar tipo a Número entero
  7. Estandarizar fechas

    • Selecciona columna FECHA
    • Cambiar tipo a Fecha
    • Si hay errores, verifica formato regional en opciones
  8. Quitar duplicados

    • Selecciona todas las columnas (Ctrl+A)
    • Inicio > Quitar filas > Quitar duplicados
  9. Resultado final

Datos limpios listos para análisis:

Fecha       | Cliente       | Monto | Categoría
------------|---------------|-------|------------
2026-01-27  | Juan Pérez    | 1500  | Electrónica
2026-01-28  | Ana López     | 2500  | Hogar
2026-01-29  | María García  | 0     | Electrónica

Checklist de Limpieza de Datos

Usa esta lista para revisar cualquier tabla antes de cargarla:

Estructura

  • Quitar filas de encabezado/pie no deseadas
  • Promover primera fila a encabezados si es necesario
  • Quitar columnas innecesarias o vacías
  • Renombrar columnas con nombres descriptivos

Calidad de datos

  • Quitar o manejar duplicados
  • Identificar y tratar valores nulos
  • Quitar o reemplazar errores
  • Rellenar valores hacia arriba/abajo si corresponde

Tipos de datos

  • Asignar tipo correcto a cada columna
  • Números como tipo numérico (no texto)
  • Fechas como tipo fecha/fecha-hora
  • IDs como texto (aunque sean números)

Formato de texto

  • Recortar espacios extra
  • Estandarizar capitalización
  • Reemplazar valores inconsistentes
  • Dividir/combinar columnas si es necesario

Rendimiento

  • Verificar Query Folding (clic derecho > Ver consulta nativa)
  • Mover filtros al inicio de los pasos
  • Documentar pasos complejos

Puntos Clave de esta Lección

  1. La limpieza es el 80% del trabajo - Invierte tiempo aquí para ahorrar problemas después
  2. Quitar duplicados estratégicamente - Selecciona las columnas correctas que definen unicidad
  3. Maneja valores nulos según el contexto - A veces filtrar, a veces reemplazar
  4. Tipos de datos correctos son críticos - Afectan cálculos, rendimiento y visualizaciones
  5. Recortar siempre columnas de texto - Los espacios invisibles causan problemas de agrupación
  6. Usa reemplazar valores para estandarizar - Corrige errores comunes de entrada manual
  7. Documenta decisiones de limpieza - Renombra pasos para clarificar qué hace cada transformación

Verificación de Conocimientos

Pregunta 1

Tienes una columna "Ventas" con valores: 1500, 2300, null, "N/A", 4100. ¿Cuál es el orden correcto de pasos para limpiarla?

A) Cambiar tipo a número → Reemplazar "N/A" por 0 → Reemplazar null por 0 B) Reemplazar "N/A" por 0 → Reemplazar null por 0 → Cambiar tipo a número C) Reemplazar null por 0 → Cambiar tipo a número → Reemplazar "N/A" por 0 D) Cambiar tipo a número → Quitar errores

Ver respuesta

Respuesta: B) Reemplazar "N/A" por 0 → Reemplazar null por 0 → Cambiar tipo a número

Debes limpiar primero los valores de texto ("N/A") y nulos ANTES de cambiar el tipo de dato. Si intentas cambiar a número primero, "N/A" se convertirá en error. El orden correcto es: limpiar texto → manejar nulos → cambiar tipo.

Pregunta 2

¿Cuál transformación mantiene Query Folding con una base de datos SQL?

A) Dividir columna de dirección completa en Calle, Número, Ciudad B) Filtrar filas donde Fecha >= 2026-01-01 C) Agregar columna personalizada con función Text.Proper D) Combinar columnas Nombre y Apellido

Ver respuesta

Respuesta: B) Filtrar filas donde Fecha >= 2026-01-01

Filtrar filas se puede traducir directamente a SQL (WHERE Fecha >= '2026-01-01'), manteniendo Query Folding. Las operaciones de dividir, agregar columnas personalizadas y combinar columnas son transformaciones complejas que rompen el folding.

Pregunta 3

Tienes duplicados en tu tabla de clientes. Algunas filas son idénticas en todas las columnas, otras solo en ClienteID pero difieren en Email. ¿Qué enfoque es mejor?

A) Seleccionar todas las columnas y quitar duplicados B) Seleccionar solo ClienteID y quitar duplicados C) Analizar primero las diferencias, decidir columnas clave, luego quitar duplicados D) No quitar duplicados, dejar que DAX lo maneje

Ver respuesta

Respuesta: C) Analizar primero las diferencias, decidir columnas clave, luego quitar duplicados

Los duplicados requieren análisis de negocio. Si ClienteID es único pero Email difiere, tienes un problema de calidad de datos que necesitas entender antes de eliminarlo automáticamente. Podría ser que un cliente actualizó su email (necesitas la última versión) o hay clientes diferentes con el mismo ID (problema grave). Analiza primero, decide después.


Próximos Pasos

En la siguiente lección aprenderás a combinar y anexar tablas, técnicas esenciales para:

  • Unir datos de múltiples archivos Excel
  • Hacer relaciones entre tablas (similar a VLOOKUP pero más potente)
  • Apilar tablas con la misma estructura
  • Combinar consultas con Merge y Append

Los datos rara vez están en una sola tabla. Dominar estas técnicas te permite integrar información de cualquier fuente.

Completaste esta leccion?

Marca esta leccion como completada. Tu progreso se guardara en tu navegador.