Reemplazar múltiples valores en una columna en Power Query (un solo paso)
TL;DR: El método nativo de Power Query (Table.ReplaceValue) genera un paso nuevo por cada sustitución. Para consolidar todos los reemplazos en un solo paso, usa List.Accumulate con una lista de pares {valor_original, valor_nuevo}. Si los reemplazos cambian frecuentemente, carga la tabla de mapeo desde Excel o un parámetro externo.
Con más de 184,000 vistas en el foro de Microsoft Fabric, esta es una de las dudas más frecuentes sobre el Lenguaje M. El problema es sencillo de reproducir: cuando aplicas la transformación «Reemplazar valores» varias veces sobre la misma columna, el panel de Pasos aplicados crece sin control y el código M queda así:
#"Valor reemplazado" = Table.ReplaceValue(Source, "A", "X", Replacer.ReplaceText, {"Columna"}),
#"Valor reemplazado1" = Table.ReplaceValue(#"Valor reemplazado", "B", "X", Replacer.ReplaceText, {"Columna"}),
#"Valor reemplazado2" = Table.ReplaceValue(#"Valor reemplazado1", "C", "X", Replacer.ReplaceText, {"Columna"}),
#"Valor reemplazado3" = Table.ReplaceValue(#"Valor reemplazado2", "D", "Y", Replacer.ReplaceText, {"Columna"}),
#"Valor reemplazado4" = Table.ReplaceValue(#"Valor reemplazado3", "E", "Y", Replacer.ReplaceText, {"Columna"})
Diez reemplazos = diez pasos = editor difícil de mantener. Hay una solución limpia.
Método 1: List.Accumulate (recomendado para reemplazos fijos)
List.Accumulate recorre una lista de pares y aplica una función acumulativa. Es la forma idiomática en M para consolidar múltiples operaciones del mismo tipo.
let
Fuente = Excel.Workbook(File.Contents("datos.xlsx"), null, true),
Tabla = Fuente{[Item="Hoja1", Kind="Sheet"]}[Data],
// Define todos los reemplazos como lista de pares {original, nuevo}
Reemplazos = {
{"Transaccional de energía digital", "Transaccional"},
{"Inicio y distribución", "Transaccional"},
{"Transaccional de bajo voltaje", "Transaccional"},
{"UNASSIGNED", "Sin asignar"},
{"UNSPECIFIED", "Sin especificar"}
},
// Un solo paso: aplica todos los reemplazos acumulativamente
Resultado = List.Accumulate(
Reemplazos,
Tabla,
(tablaAcum, par) =>
Table.ReplaceValue(
tablaAcum,
par{0}, // valor original
par{1}, // valor nuevo
Replacer.ReplaceText,
{"BMP"} // columna(s) donde aplicar
)
)
in
Resultado
El panel de Pasos aplicados muestra un único paso llamado Resultado. Si necesitas agregar o quitar reemplazos, solo editas la lista Reemplazos.
Para reemplazar en múltiples columnas a la vez
Cambia la lista de columnas en el cuarto argumento de Table.ReplaceValue:
(tablaAcum, par) =>
Table.ReplaceValue(
tablaAcum,
par{0},
par{1},
Replacer.ReplaceText,
{"Columna1", "Columna2", "Columna3"} // aplica en todas
)
Método 2: tabla de mapeo desde Excel (recomendado cuando los reemplazos cambian)
Cuando el equipo de negocio actualiza los valores de referencia regularmente, es mejor no tocar la consulta M. Carga la tabla de mapeo desde un archivo Excel:
let
// Tabla de origen
Fuente = Excel.Workbook(File.Contents("ventas.xlsx"), null, true),
Ventas = Fuente{[Item="Datos", Kind="Sheet"]}[Data],
// Tabla de mapeo externa (dos columnas: Viejo | Nuevo)
Mapa = Excel.Workbook(File.Contents("mapeo_categorias.xlsx"), null, true),
TabMapa = Mapa{[Item="Mapeo", Kind="Sheet"]}[Data],
// Convertir tabla de mapeo a Record: {[Viejo] -> Nuevo}
Registro = Record.FromList(TabMapa[Nuevo], TabMapa[Viejo]),
// Aplicar sustitución usando el record como diccionario
Resultado = Table.TransformColumns(
Ventas,
{"BMP", each Record.FieldOrDefault(Registro, _, _)}
)
in
Resultado
Record.FieldOrDefault(registro, clave, valorPorDefecto) devuelve el valor mapeado si existe, o el valor original si no está en el diccionario. Esto evita errores cuando hay valores en la columna que no están en la tabla de mapeo.
Ventajas del método con tabla de mapeo
- El equipo de negocio puede actualizar
mapeo_categorias.xlsxsin tocar Power Query - Funciona con cientos de reemplazos sin impactar el rendimiento
- Auditable: la tabla de mapeo es un artefacto separado controlable en SharePoint o Teams
Método 3: usando Text.Replace en columna calculada (reemplazos simples)
Para reemplazos de texto literal en un solo valor de columna, sin necesidad de acumulación:
Table.AddColumn(Fuente, "BMP_Limpio",
each if [BMP] = "Transaccional de energía digital" then "Transaccional"
else if [BMP] = "Inicio y distribución" then "Transaccional"
else if [BMP] = "UNASSIGNED" then "Sin asignar"
else [BMP]
)
Este método es más legible para pocos reemplazos pero no escala bien más allá de 5-6 condiciones.
Comparativa de métodos
| Método | Número de reemplazos | Mantenimiento | Rendimiento |
|---|---|---|---|
| Pasos individuales (nativo) | Cualquiera | Difícil (un paso por reemplazo) | Normal |
List.Accumulate |
5-100 | Fácil (lista en el código) | Normal |
| Tabla de mapeo externa | 10-1000+ | Muy fácil (sin tocar M) | Normal |
if/else en columna calculada |
2-5 | Aceptable | Normal |
Errores frecuentes al usar List.Accumulate
Error: Expression.Error: We cannot apply operator & to types List and Text
Causa: Los pares de reemplazos deben ser listas {texto, texto}, no records [viejo=x, nuevo=y].
Fix: Asegúrate de usar llaves {} con índice, no corchetes [].
Error: Los reemplazos no se aplican aunque la sintaxis es correcta
Causa: El valor en la columna tiene espacios adicionales o mayúsculas distintas.
Fix: Normaliza antes con Text.Trim y Text.Lower:
Normalizado = Table.TransformColumns(Fuente, {"BMP", Text.Trim}),

Power Query: Lenguaje M aplicado a casos prácticos Office365 Excel
Fuente: hilo del foro oficial de Microsoft Fabric con más de 184,000 vistas y solución verificada por la comunidad.

Deja una respuesta