Forum Discussion

khom's avatar
khom
Frequent Visitor
3 years ago
Solved

Power Query - How do I Categorize "Table1" based on "Lookup_Table"

Hi,

I'm newbie for power query. I'm looking forward to have this categorization since I have a lot of data with this data arrangement.

 

I have this "Table1" (blue color) which contains "Combo"  column, and I want to categorize the Table accordingly to "Lookup_Table" (orange). Here's my expected output table in green color. My condition is if Table1, Item1 ("A-B-C-D-E") contains "A-B-C" and not in particular order, it will categorize it as Football. Same as Item#2 ("F-G-H") , if  Combo contains "F-H"  it will categorize it as Basketball.

  • khom 

     

    >> Go to power query >> select "Table1" >> Go to Home tab Merge Queries >> Select Lookup Table >> Select Bottom Use fuzzy Matching >> Get Your Out Put >> Select Merge Queries and as new your needs.

     

     

     

     

     

     

     

     

    **Did I answer your question? Mark my post as a solution! Appreciate your Kudos !!

  • Hi khom ,
    I would use the List.ContainsAll function for it.
    Therefore you have to split up the strings into list by using "-" as delimiter:

    let
      Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
      #"Changed Type" = Table.TransformColumnTypes(Source, {{"Item", Int64.Type}, {"Combo", type text}}), 
      #"Added Custom" = Table.AddColumn(#"Changed Type", "ListOfValues", each Text.Split([Combo], "-")), 
      #"Added Custom1" = Table.AddColumn(
        #"Added Custom", 
        "Category", 
        each Table.SelectRows(
          Lookup_Table, 
          (LookupTable) => List.ContainsAll([ListOfValues], LookupTable[ListOfValues])
        ){0}?[Category]?
      )
    in
      #"Added Custom1"

    Please also check the file enclosed.




  • Hi khom 

    Place the following M code in a blank query to see the steps. See it all at work in the attached file.

     

     

    let
        Source = Table1,
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Item", Int64.Type}, {"Combo", type text}}),
        #"Added Custom1" = Table.AddColumn(#"Changed Type", "Category", each 
        let 
           combo_ = Text.Split([Combo], "-"),
           res_ = Table.SelectRows(LookUpTable, (inner)=> List.Count(List.Intersect({combo_, Text.Split(inner[Lookup], "-")})) = List.Count(Text.Split(inner[Lookup], "-")))
        in 
           try res_[Category]{0} otherwise null),
        
        #"Changed Type1" = Table.TransformColumnTypes(#"Added Custom1",{{"Category", type text}})
    in
        #"Changed Type1"

     

     

     

    Please accept the solution when done and consider giving a thumbs up if posts are helpful. 

    Contact me privately for support with any larger-scale BI needs, tutoring, etc.

     

12 Replies

  • khom 

     

    >> Go to power query >> select "Table1" >> Go to Home tab Merge Queries >> Select Lookup Table >> Select Bottom Use fuzzy Matching >> Get Your Out Put >> Select Merge Queries and as new your needs.

     

     

     

     

     

     

     

     

    **Did I answer your question? Mark my post as a solution! Appreciate your Kudos !!

    • khom's avatar
      khom
      Frequent Visitor

      Thanks. This is working too. I never tried fuzzy matching before. Glad to know it does the work.

  • ImkeF's avatar
    ImkeF
    Community Champion

    Hi khom ,
    not sure I fully understand the requirement: Would C-B-A also classify as Football or must the order of the characters be maintained and just their position with the substring be ignored?

     

    • khom's avatar
      khom
      Frequent Visitor

      Hi ImkeF. For this case, the order of A-B-C does not matter. C-B-A is classified as Football as long as character this combination of A,B,C is there. You are right, the position within the substring is ignored.

      • ImkeF's avatar
        ImkeF
        Community Champion

        Hi khom ,
        I would use the List.ContainsAll function for it.
        Therefore you have to split up the strings into list by using "-" as delimiter:

        let
          Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
          #"Changed Type" = Table.TransformColumnTypes(Source, {{"Item", Int64.Type}, {"Combo", type text}}), 
          #"Added Custom" = Table.AddColumn(#"Changed Type", "ListOfValues", each Text.Split([Combo], "-")), 
          #"Added Custom1" = Table.AddColumn(
            #"Added Custom", 
            "Category", 
            each Table.SelectRows(
              Lookup_Table, 
              (LookupTable) => List.ContainsAll([ListOfValues], LookupTable[ListOfValues])
            ){0}?[Category]?
          )
        in
          #"Added Custom1"

        Please also check the file enclosed.




  • AlB's avatar
    AlB
    Community Champion

    Hi khom 

    Place the following M code in a blank query to see the steps. See it all at work in the attached file.

     

     

    let
        Source = Table1,
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Item", Int64.Type}, {"Combo", type text}}),
        #"Added Custom1" = Table.AddColumn(#"Changed Type", "Category", each 
        let 
           combo_ = Text.Split([Combo], "-"),
           res_ = Table.SelectRows(LookUpTable, (inner)=> List.Count(List.Intersect({combo_, Text.Split(inner[Lookup], "-")})) = List.Count(Text.Split(inner[Lookup], "-")))
        in 
           try res_[Category]{0} otherwise null),
        
        #"Changed Type1" = Table.TransformColumnTypes(#"Added Custom1",{{"Category", type text}})
    in
        #"Changed Type1"

     

     

     

    Please accept the solution when done and consider giving a thumbs up if posts are helpful. 

    Contact me privately for support with any larger-scale BI needs, tutoring, etc.

     

    • khom's avatar
      khom
      Frequent Visitor

      Hi AIB. Thanks. This is work as intended. I will take a look on List.Intercept function that you used. Sorry, initially I unable to open the your file directly since my version of powerbi is outdated.

    • khom's avatar
      khom
      Frequent Visitor

      Hi AIB,

       

      I've started using the code. I have this scenario whereby:

       

      if my combo listed as below:

       

      e.g.

      1. A-B-C =  Categorized as " Football"

      2. A-B-C-D = Should Categorized as "Soccer", but this one is categorized as "Football" instead.

       

      Is there a way to address this?

  • ImkeF's avatar
    ImkeF
    Community Champion

    Hi  ,
    The expression "(Lookuptable)=> " is the beginning of a definition of a function. That function has one argument: The (current) row of the Lookuptable (according to your specification).
    Usually, this is identical with the "each" keyword that will be used by Power Query automatically when creating a Table.SelectRow statement. But I am using it in an area where the "each" keyword is used already, therefore to avoid ambiguity, I have to use a specific function declaration.


    A number in curly bracket {0} is the positional index operator and picks the n-th element of the object it is applied to (usually a table or a list).

     

    A text in square brackets [Category] is a lookup operator and picks the named element from an object (either a column from a table or a field from a record.

     

    The ? is used to cater for missing values: If the desired element can actually not be found, instead of an error, then null will be returned instead.

     

    If you want to learn more about the basics of the M-language, please check out this page that is the start of a nice compact introduction: Power Query M Formula Language Introduction - PowerQuery M | Microsoft Learn

     
    • khom's avatar
      khom
      Frequent Visitor

      Thanks for the detailed explanation and your help. This clarifies my doubt. 

    • khom's avatar
      khom
      Frequent Visitor

      Hi Imkef,

      I've started using the code. I have this scenario whereby:

       

      if my combo listed as below:

       

      e.g.

      1. A-B-C =  Categorized as " Football"

      2. A-B-C-D = Should Categorized as "Soccer", but this one is categorized as "Football" instead.

       

      Is there a way to address this?