Limpieza de datos: nulls, duplicados, tipos
Técnicas esenciales para datos limpios y consistentes.
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:
- Ve a Inicio > Quitar filas > Quitar filas superiores
- Especifica cuántas filas eliminar (ejemplo: 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:
- Inicio > Quitar filas > Quitar filas inferiores
- 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:
- Inicio > Quitar filas > Quitar filas alternativas
- 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
- Selecciona todas las columnas (Ctrl+A)
- Inicio > Quitar filas > Quitar duplicados
- Se mantiene la primera ocurrencia de cada combinación única
Opción 2: Quitar duplicados basándose en columnas específicas
- Selecciona solo las columnas relevantes (ejemplo: ClienteID, Fecha)
- Inicio > Quitar duplicados
- 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:
- Selecciona columnas de referencia
- 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
- Clic derecho en el encabezado de la columna
- Quitar
Código M:
= Table.RemoveColumns(#"Paso anterior", {"Columna1", "Columna2"})
Quitar otras columnas
Cuando quieres MANTENER solo algunas columnas:
- Selecciona las columnas a conservar (Ctrl+clic)
- 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:
- Clic derecho en cualquier encabezado
- 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:
- Ve a Vista > marca Calidad de columna
- Ve a Vista > marca Distribución de columna
- 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:
- Haz clic en el filtro de la columna (triángulo junto al nombre)
- Desmarca (null)
- Aceptar
Código M:
= Table.SelectRows(#"Paso anterior", each [Columna] <> null)
Reemplazar valores nulos
Para sustituir nulos por un valor predeterminado:
- Clic derecho en la columna con nulos
- Reemplazar valores
- Valor que buscar: (dejar en blanco)
- Reemplazar con:
0(o el valor deseado) - 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:
- Selecciona la columna Categoría
- Transformar > Rellenar > Abajo
- 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:
- Clic en el filtro de la columna
- Desmarca Error
- Aceptar
O bien:
- Clic derecho en la columna con errores
- Quitar errores
Código M:
= Table.RemoveRowsWithErrors(#"Paso anterior", {"Columna"})
Reemplazar errores
Para sustituir errores por un valor:
- Clic derecho en la columna con errores
- Reemplazar errores
- Valor:
0o"Error detectado" - 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
- Haz clic en el icono junto al nombre de columna (ABC, 123, etc.)
- Selecciona el nuevo tipo de la lista
Método 2: Desde la cinta
- Selecciona la columna
- Transformar > Tipo de datos > Selecciona el tipo
Método 3: Detectar automáticamente
- Selecciona múltiples columnas
- Transformar > Detectar tipo de datos
- 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:
- Selecciona columna de texto
- Transformar > Formato > Selecciona formato
- 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
- Selecciona columna
- Transformar > Formato > Recortar
Código M:
= Table.TransformColumns(#"Paso anterior", {{"Columna", Text.Trim, type text}})
Limpiar: Elimina espacios extra entre palabras
- Transformar > Formato > Limpiar
- 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:
- Clic derecho en la columna
- Reemplazar valores
- Valor que buscar:
Cdmx - Reemplazar con:
Ciudad de México - 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:
- Selecciona columna con múltiples valores (ej: "Apellido, Nombre")
- Transformar > Dividir columna > Por delimitador
- Selecciona delimitador:
,o--Personalizado-- - Dividir en: Cada repetición del delimitador
- 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:
- Selecciona columnas a combinar (Ctrl+clic): "Nombre" y "Apellido"
- Transformar > Combinar columnas
- Separador:
Espacio(o personalizado como ", ") - Nuevo nombre de columna:
NombreCompleto - Aceptar
Código M:
= Table.CombineColumns(
#"Paso anterior",
{"Nombre", "Apellido"},
Combiner.CombineTextByDelimiter(" ", QuoteStyle.None),
"NombreCompleto"
)
Extraer texto
Primeros caracteres:
- Transformar > Extraer > Primeros caracteres
- Cuenta:
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
- 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
Quitar filas de encabezado extra
- Inicio > Quitar filas > Quitar filas superiores > 2
- Elimina las filas de sistema
Promover primera fila a encabezados
- Inicio > Usar primera fila como encabezados
- Ahora tienes columnas: FECHA, CLIENTE, MONTO, CATEGORÍA, INTERNO
Quitar columna innecesaria
- Clic derecho en "INTERNO" > Quitar
Limpiar nombres de columnas
- Doble clic en " MONTO " > Escribe "Monto"
- Repite para normalizar nombres
Limpiar espacios en CLIENTE
- Selecciona columna CLIENTE
- Transformar > Formato > Recortar
- Transformar > Formato > Poner en mayúsculas cada palabra
Limpiar columna Monto
- Reemplazar valores: "," por "" (eliminar comas)
- Reemplazar valores: "N/A" por "0"
- Cambiar tipo a Número entero
Estandarizar fechas
- Selecciona columna FECHA
- Cambiar tipo a Fecha
- Si hay errores, verifica formato regional en opciones
Quitar duplicados
- Selecciona todas las columnas (Ctrl+A)
- Inicio > Quitar filas > Quitar duplicados
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
- La limpieza es el 80% del trabajo - Invierte tiempo aquí para ahorrar problemas después
- Quitar duplicados estratégicamente - Selecciona las columnas correctas que definen unicidad
- Maneja valores nulos según el contexto - A veces filtrar, a veces reemplazar
- Tipos de datos correctos son críticos - Afectan cálculos, rendimiento y visualizaciones
- Recortar siempre columnas de texto - Los espacios invisibles causan problemas de agrupación
- Usa reemplazar valores para estandarizar - Corrige errores comunes de entrada manual
- 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.