jueves, 29 de julio de 2021

Power Query: Table.ReplaceValue condicionado

Hoy veremos un ejercicio sencillo pero muy práctico con Power Query: Aplicar sobre una columna un reemplazamiento condicionado a valores de terceras columnas.
En el ejemplo que propongo vamos a reemplazar los elementos de la columna 'Responsable' (cualquiera de ellos) que coincida con un país concreto ('ES') y un año en particular ('2020').
Power Query: Table.ReplaceValue condicionado

Así pues cargaremos nuestra tabla desde la ficha Datos > grupo Obtener y transformar > Desde Tabla o rango, y desde el editor de consultas de Power Query, seleccionamos nuestra tabla recien cargada y presionaremos Editor avanzado, donde implementaremos el siguiente código M:
let
    Origen = Excel.CurrentWorkbook(){[Name="Tabla1"]}[Content],
    //dejamos el tipo cambiado...
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Fecha", type date}, {"Cliente", type text}, {"Producto", type text}, {"País", type text}, {"Responsable", type text}}),

    //usamos la función Table.ReplaceValue
    //Table.ReplaceValue(table as table, oldValue as any, newValue as any, replacer as function, columnsToSearch as list) as table
    ReemplazoValorCondicionado=
            Table.ReplaceValue(TipoCambiado,            //table sobre la que trabajamos 
                                each [Responsable],     //valor viejo a cambiar
                                //y con la condición definimos el nuevo valor por el que sustituiremos.. condicionado
                                each if ([País]="ES" and Date.Year([Fecha])=2020 ) then "Ismael" else [Responsable],
                                Replacer.ReplaceValue, //tipo de reemplazamiento
                                {"Responsable"})  //columna donde buscar el valor a cambiar
in
    ReemplazoValorCondicionado

Power Query: Table.ReplaceValue condicionado

Especialmente interesante el uso del 'each' que hemos aplicado, que permite recorrer fila por fila, aplicando, si cruza con las condiciones dadas, el reemplazamiento buscado...

Si hubieramos realizado un reemplazamiento 'normal' y global sobre la columna de 'responsable' hubiéramos obtenido el siguiente código:
Table.ReplaceValue(TipoCambiado,
    	"María",
        "Ismael",
        Replacer.ReplaceText,
        {"Responsable"})

Donde en la columna 'Responsable' buscamos el valor 'María' para reemplazarlo por 'Ismael', donde por defecto aplica la función de sustitución Replacer.ReplaceText (cadena de texto).
La personalización en nuestro caso pasa por el 'loop' de each, donde al evaluar registro a registro, habilita la posibilidad con un if.. then...else... comprobar las condiciones requeridas:
TTable.ReplaceValue(TipoCambiado,            //table sobre la que trabajamos 
                                each [Responsable],     //valor viejo a cambiar
                                //y con la condición definimos el nuevo valor por el que sustituiremos.. condicionado
                                each if ([País]="ES" and Date.Year([Fecha])=2020 ) then "Ismael" else [Responsable],
                                Replacer.ReplaceValue, //tipo de reemplazamiento
                                {"Responsable"})  //columna donde buscar el valor a cambiar)

De esta forma obtenemos lo deseado, un reemplazamiento de ciertos valores condicionados a otras columnas!!

OJO!!, solo hay un pero, que debes tener presente... este proceso cambia el tipo de dato de la columna. Si fuera importante mantenerlo, deberás añadir un nuevo paso ajustándolo.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.