Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
6 years ago
Solved

Replacing values in multiple columns based on condition in Power Query

Hello,

 

I have a table like this:

Date    plan        unplan        internal        external        production         day flag    
1/1/2020    0050706000Production Day
1/2/2020    00000Non-Production Day
1/3/2020    001002001300Down Day
1/4/2020    0030805000Production Day
1/5/2020    001201501000Down Day
1/6/2020    00000Non-Production Day
1/7/2020    00000Non-Production Day

 

if [day flag] = "Down Day" then replace [plan], [unplan], [internal] and [external] columns with null, else keep original values.

The result like this:

Date    plan        unplan        internal        external         production    day flag
1/1/2020    0050706000Production Day
1/2/2020    00000Non-Production Day
1/3/2020    nullnullnullnull1300Down Day
1/4/2020    0030805000Production Day
1/5/2020    nullnullnullnull1000Down Day
1/6/2020    00000Non-Production Day
1/7/2020    00000Non-Production Day

 

I use code:

#"Replaced Value1" = Table.ReplaceValue(Source, each [plan], each if [day flag] = "Down Day" then null else [plan],Replacer.ReplaceValue,{"plan"}),
#"Replaced Value2" = Table.ReplaceValue(#"Replaced Value1",each [unplan], each if [day flag] = "Down Day" then null else [unplan], Replacer.ReplaceValue,{"unplan"}),
#"Replaced Value3" = ...

#"Replaced Value4" = ...

 

As you see, I have to repeat same logic 4 times for replace values of [plan], [unplan], [internal] and [external] columns. Actually, in my table, there are 20 columns need do that. I don't want to repeat this logic 20 times.

 

I was wondering if any better solution for my situation?

 

Thanks!

  • Hi, Anonymous 

    Based on the simulated data source and the data processing logic you provided, write the query code like this:

    = Table.ReplaceValue(Source, each [day flag]="Down Day", null, (x,y,z)=> if y then z else x, List.Range(Table.ColumnNames(Source),1,4))

    If my code solves your problem, mark it as a solution

  • Hi, Anonymous 

     

    As what is suggested by ziying35 , I created data to reproduce your scenario. The pbix file is attached in the end.

    Table:

     

    You may insert a new step as below. On your side, you may add all corresponding columns in {"plan","unplan","internal","external",...}.

    = Table.ReplaceValue(Source, each [day flag]="Down Day", null, (x,y,z)=> if y then z else x, List.Select(Table.ColumnNames(#"Changed Type"),
    each  List.Contains( {"plan","unplan","internal","external"},_)
    )
    )

     

    Result:

     

    Best Regards

    Allan

     

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

14 Replies

  • ziying35's avatar
    ziying35
    Impactful Individual

    Hi, Anonymous 

    Based on the simulated data source and the data processing logic you provided, write the query code like this:

    = Table.ReplaceValue(Source, each [day flag]="Down Day", null, (x,y,z)=> if y then z else x, List.Range(Table.ColumnNames(Source),1,4))

    If my code solves your problem, mark it as a solution

    • Rickmaurinus's avatar
      Rickmaurinus
      Helper V

      Hey ziying35.

       

      I included your solution in my blogpost at https://gorilla.bi/power-query/replace-values/

      However, I'm accustomed to working with Replacer.ReplaceValues and Replacer.ReplaceText. I don't fully understand your example. 

      Can you elaborate on the inner workings of : 

      (x,y,z)=> if y then z else x?

       

      Warm regards,

      Rick

      • ziying35's avatar
        ziying35
        Impactful Individual

        Simple understanding: the second parameter of the function Table.ReplaceValue is represented by y, the third parameter is represented by z, and the replaced element itself is represented by x

    • Anonymous's avatar
      Anonymous
      Not applicable

      Hi ziying35 , Sorry for pinging you on this old topic. This method works perfectly if I just want to replace the value with a fixed value (null @ 1 @2, etc). But what if I want to multiple the old value with 1000? For example if the old value is 1000, instead of changing it to null i want to make it 1,000,000.

      I tried changing the null to below, but it didn't work.

      each _ * 1000

       

      • Anonymous's avatar
        Anonymous
        Not applicable

        Figured it out minutes after asking this.

         

        = Table.ReplaceValue(
           Source, 
           each [day flag]="Down Day", 
           each _, // this step become redundant, but needed to fill the syntax requirement
           // (x,y,z)=> if y then z else x, --- this is the original one, below is edited.
           (x,y,z)=> if y then x*1000 else x,  // we just ignore z, and replace it with x*1000
           List.Range(Table.ColumnNames(Source),1,4)
        )
  • v-alq-msft's avatar
    v-alq-msft
    Community Support

    Hi, Anonymous 

     

    As what is suggested by ziying35 , I created data to reproduce your scenario. The pbix file is attached in the end.

    Table:

     

    You may insert a new step as below. On your side, you may add all corresponding columns in {"plan","unplan","internal","external",...}.

    = Table.ReplaceValue(Source, each [day flag]="Down Day", null, (x,y,z)=> if y then z else x, List.Select(Table.ColumnNames(#"Changed Type"),
    each  List.Contains( {"plan","unplan","internal","external"},_)
    )
    )

     

    Result:

     

    Best Regards

    Allan

     

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

    • Anonymous's avatar
      Anonymous
      Not applicable

      Thank you very much! Your demostration is really very helpful for understanding the code. It works on my end!

  • edhans's avatar
    edhans
    Community Champion

    You can include multiple columns in the list. This is a text replacement. Just add more columns in the list brackets {}

    Table.ReplaceValue(#"Filtered Rows","a","g",Replacer.ReplaceText,{"Stock Item", "Color", "Selling Package"})

     

  • Another way to do it, is the unpivot your columns, and then on the newly created column apply a conditional replace operation. 

     

     

    = Table.ReplaceValue(
         #"Changed Type",
         each [Value],
         each if [day flag] = "Down Day" then null else [Value],
         Replacer.ReplaceValue,{"Value"}
     )

     

     

    You can find the details on the conditional replace right here: 

    https://gorilla.bi/power-query/replace-values/#conditionally-replace-values

     

    --------------------------------------------------

    @ me in replies or I'll lose your thread

     

    Master Power Query M? -> https://powerquery.how

    Read in-depth articles? -> BI Gorilla

    Youtube Channel: BI Gorilla

     

    If this post helps, then please consider accepting it as the solution to help other members find it more quickly.