Saltar al contenido

Reemplazar múltiples valores en una columna en Power Query (un solo paso)

Infografía: consolidar varios pasos 'Replaced Value' en un solo paso con List.Accumulate en Power Query

Escrito por

en

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.xlsx sin 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 ExcelTOP VENTASUdemy
Power Query

Power Query: Lenguaje M aplicado a casos prácticos Office365 Excel

★ 4.6(1300 estudiantes)
$19.99

Fuente: hilo del foro oficial de Microsoft Fabric con más de 184,000 vistas y solución verificada por la comunidad.

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *