Home » Column Combining! Part 2

Column Combining! Part 2

Solving Column Combining Part 2 challenge by Power Query, Power BI, Excel, Python and R

Given multiple columns, concatenate them based on the order presented on the pattern column using space as a delimiter.

📌 Challenge Details and Links
Challenge Number: 199
Challenge Difficulty: ⭐⭐⭐
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Column Combining! Part 2 with Power Query

Power Query solution 1 for Column Combining! Part 2, proposed by Zoran Milokanović:
let
  Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content], 
  _ = Table.TransformRows(
    Source, 
    each 
      let
        l = Record.ToList(_)
      in
        Text.Combine(List.Transform(Text.Split(l{3}, ","), each l{Number.From(_) - 1}), " ")
  )
in
  _
Power Query solution 2 for Column Combining! Part 2, proposed by Zoran Milokanović:
let
  Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content], 
  _ = Table.TransformRows(
    Source, 
    each 
      let
        l = Record.ToList(_)
      in
        Text.Combine(List.Transform(Expression.Evaluate("{" & l{3} & "}"), each l{_ - 1}), " ")
  )
in
  _
Power Query solution 3 for Column Combining! Part 2, proposed by Luan Rodrigues:
let
  Fonte = Table.AddColumn(
    Tabela1, 
    "Result", 
    each 
      let
        a = Text.Split([Pattern], ","), 
        b = Record.FieldValues(_), 
        c = List.Transform(a, (x) => Number.From(x) - 1), 
        d = Text.Combine(List.Transform(c, (y) => b{y}), " ")
      in
        d
  )[[Result]]
in
  Fonte
Power Query solution 4 for Column Combining! Part 2, proposed by Rafael González B.:
let
  Source = Question_Table, 
  Result = Table.AddColumn(
    Source, 
    "Custom Format", 
    each 
      let
        a = Record.ToList(_), 
        b = List.RemoveLastN(a, 1), 
        c = Text.Split(List.Last(a), ","), 
        d = List.Transform(c, each b{Number.From(_) - 1}), 
        e = Text.Combine(d, " ")
      in
        e, 
    type text
  )[[Custom Format]]
in
  Result
Power Query solution 5 for Column Combining! Part 2, proposed by Ramiro Ayala Chávez:
let
S = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
a = Table.ToRows(S),
Fx = (x)=> let
b = List.Transform(Text.Split(List.Last(x),","),Number.From),
c = List.RemoveLastN(x),
d = {1..List.Count(c)},
e = List.Zip({c,d}),
f = List.Sort(e,{each List.PositionOf(b,_{1})}),
g = List.Select(f, each List.ContainsAll(b,{_{1}})),
h = Text.Combine(List.Transform(g, each _{0})," "),
i = Table.FromValue(h,[DefaultColumnName="Custom Format"])
in i,
Sol = Table.Combine(List.Transform(a, each Fx(_)))
in
Sol
Power Query solution 6 for Column Combining! Part 2, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Sol = Table.AddColumn(Source, "Result", each 
 let
 a = Record.ToList(_),
 b = List.RemoveLastN(a),
 c = List.Transform(Text.Split(List.Last(a), ","), each b{Number.From(_)-1}),
 d = Text.Combine(c, " ")
 in d)[[Result]]
in
Sol
Power Query solution 7 for Column Combining! Part 2, proposed by Kris Jaganah:
Table.AddColumn(
  Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  "Custom Format", 
  each Text.Combine(
    List.Transform(Text.Split([Pattern], ","), (v) => Record.ToList(_){Number.From(v) - 1}), 
    " "
  )
)
Power Query solution 8 for Column Combining! Part 2, proposed by Abdallah Ally:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Result = Table.AddColumn(
    Source, 
    "Result", 
    each [
      a = Record.ToList(_), 
      b = List.Transform(Text.Split(a{3}, ","), (x) => a{Number.From(x) - 1}), 
      c = Text.Combine(b, " ")
    ][c]
  )[[Result]]
in
  Result
Power Query solution 9 for Column Combining! Part 2, proposed by CA Raghunath Gundi:
able.AddColumn(
  Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  "Custom Format", 
  each Text.Combine(
    List.ReplaceMatchingItems(
      Text.Split([Pattern], ","), 
      {{"3", [Last Name]}, {"2", [Middle Name]}, {"1", [First Name]}}
    ), 
    " "
  )
)[[Custom Format]]
Power Query solution 10 for Column Combining! Part 2, proposed by Meganathan Elumalai:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Result = Table.AddColumn(
    Source, 
    "Custom Format", 
    each Text.Combine(
      List.Transform(Text.Split([Pattern], ","), (f) => Record.ToList(_){Number.From(f) - 1}), 
      " "
    )
  )[[Custom Format]]
in
  Result
Power Query solution 11 for Column Combining! Part 2, proposed by Seokho MOON:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Res = Table.FromList(Table.ToRows(Source), Fun, {"Custom Format"}), 
  Fun = each [
    A = List.Transform(Text.Split(_{3}, ","), (x) => _{Number.From(x) - 1}), 
    B = {Text.Combine(A, " ")}
  ][B]
in
  Res
Power Query solution 12 for Column Combining! Part 2, proposed by Glyn Willis:
let
  cols = List.Buffer(Table.ColumnNames(Source)), 
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  #"Added Custom" = Table.AddColumn(
    Source, 
    "Result", 
    each Text.Combine(
      List.Transform(
        Text.Split([Pattern], ","), 
        (x) => Record.FieldOrDefault(_, cols{Number.From(x) - 1})
      ), 
      " "
    ), 
    type text
  )[[Result]]
in
  #"Added Custom"
Power Query solution 13 for Column Combining! Part 2, proposed by Sahan Jayasuriya:
let
  Source = Excel.CurrentWorkbook(){[Name = "Data"]}[Content], 
  RowlevelTransform = Table.TransformRows(
    Source, 
    each [
      a = List.Transform(Text.Split(_[Pattern], ","), (x) => Number.From(x)), 
      b = List.RemoveLastN(Record.ToList(_), 1), 
      c = List.Transform(a, (x) => b{x - 1}), 
      d = {Text.Combine(c, " ")}
    ][d]
  ), 
  Result = Table.FromRows(RowlevelTransform, {"Result"})
in
  Result
Power Query solution 14 for Column Combining! Part 2, proposed by Tyler N.:
Table.FromColumns(
  {
    List.Transform(
      Table.ToRows(YourTable), 
      (x) =>
        Text.Combine(List.Transform(Text.Split(List.Last(x), ","), (y) => x{Int8.From(y) - 1}), " ")
    )
  }, 
  {"Custom Format"}
)
Power Query solution 15 for Column Combining! Part 2, proposed by Vida Vaitkunaite:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Custom = Table.AddColumn(
    Source, 
    "Custom Format", 
    each 
      let
        a = List.RemoveLastN(Record.FieldValues(_)), 
        b = Text.Split([Pattern], ","), 
        c = Text.Combine(List.Transform(b, (x) => a{Number.From(x) - 1}), " ")
      in
        c
  )[[Custom Format]]
in
  Custom

Solving the challenge of Column Combining! Part 2 with Excel

Excel solution 1 for Column Combining! Part 2, proposed by Oscar Mendez Roca Farell:
=MAP(
    E3:E7,
    LAMBDA(
        b,
        CONCAT(
            INDEX(
                TAKE(
                    B3:b,
                    1
                ),
                TEXTSPLIT(
                    b,
                    ","
                )
            )&" "
        )
    )
)

A little bit shorter applying great idea of John Jairo Vergara Domínguez:

=MAP(
    E3:E7,
    LAMBDA(
        b,
        CONCAT(
            INDEX(
                B7:b,
                ,
                TEXTSPLIT(
                    b,
                    ","
                )
            )&" "
        )
    )
)
Excel solution 2 for Column Combining! Part 2, proposed by Kris Jaganah:
=BYROW(
    B3:E7,
    LAMBDA(
        x,
        TEXTJOIN(
            " ",
            ,
            INDEX(
                DROP(
                    x,
                    ,
                    -1
                ),
                ,
                --TEXTSPLIT(
                    TAKE(
                    x,
                    ,
                    -1
                ),
                    ","
                )
            )
        )
    )
)
Excel solution 3 for Column Combining! Part 2, proposed by John Jairo Vergara Domínguez:
=MAP(
    E3:E7,
    LAMBDA(
        x,
        TEXTJOIN(
            " ",
            ,
            INDEX(
                B7:x,
                ,
                TEXTSPLIT(
                    x,
                    ","
                )
            )
        )
    )
)
Excel solution 4 for Column Combining! Part 2, proposed by Ivan William:
=MAP(
    E3:E7,
    LAMBDA(
        v,
        TEXTJOIN(
            " ",
            ,
            CHOOSECOLS(
                TAKE(
                    B7:v,
                    1,
                    3
                ),
                --TEXTSPLIT(
                    v,
                    ","
                )
            )
        )
    )
)



#Reduce
=DROP(
    REDUCE(
        0,
        E3:E7,
        LAMBDA(
            x,
            v,
            VSTACK(
                x,
                TEXTJOIN(
                    " ",
                    ,
                    CHOOSECOLS(
                        TAKE(
                    B7:v,
                    1,
                    3
                ),
                        --TEXTSPLIT(
                            v,
                            ","
                        )
                    )
                )
            )
        )
    ),
    1
)
Excel solution 5 for Column Combining! Part 2, proposed by Sunny Baggu:
=BYROW(     B3:E7,     LAMBDA(
         a,          TEXTJOIN(
              
               " ",
              
               1,
              
               INDEX(
                   DROP(
                       a,
                        ,
                        -1
                   ),
                    --TEXTSPLIT(
                        TAKE(
                       a,
                        ,
                        -1
                   ),
                         ","
                    )
               )
               
          )     ))
Excel solution 6 for Column Combining! Part 2, proposed by Sunny Baggu:
=MAP(     SEQUENCE(
         ROWS(
             B3:E7
         )
     ),     LAMBDA(
         a,          TEXTJOIN(
              
               " ",
              
               ,
              
               XLOOKUP(
                   
                    TEXTSPLIT(
                        INDEX(
                            E3:E7,
                             a,
                             
                        ),
                         ","
                    ) + 0,
                   
                    SEQUENCE(
                        ,
                         3
                    ),
                   
                    INDEX(
                        B3:D7,
                         a,
                         
                    )
                    
               )
               
          )     ))
Excel solution 7 for Column Combining! Part 2, proposed by abdelaziz allam:
=BYROW(
    B3:E7,
    LAMBDA(
        a,
        CONCAT(
            " "&INDEX(
                TAKE(
                    a,
                    ,
                    3
                ),
                TEXTSPLIT(
                    TAKE(
                        a,
                        ,
                        -1
                    ),
                    ","
                )
            )
        )
    )
)
Excel solution 8 for Column Combining! Part 2, proposed by Bilal Mahmoud kh.:
=BYROW(B3:E7,
    LAMBDA(r,
    TEXTJOIN(" ",
    ,
    MAP(TEXTSPLIT((TAKE(
        r,
        ,
        -1
    )),
    ,
    ","),
    LAMBDA(
        n,
        CHOOSECOLS(
            r,
            n
        )
    )))))
Excel solution 9 for Column Combining! Part 2, proposed by CA Mohit Saxena:
=MAP(
    E3:E7,
    LAMBDA(
        a,
        TEXTJOIN(
            " ",
            INDEX(
                OFFSET(
                    a,
                    ,
                    -3,
                    1,
                    3
                ),
                ,
                TEXTSPLIT(
                    a,
                    ","
                )
            )
        )
    )
)
Excel solution 10 for Column Combining! Part 2, proposed by CA Raghunath Gundi:
=BYROW(
    B3:E7,
    LAMBDA(
        a,
        LET(
            name,
            DROP(
                a,
                ,
                -1
            ),
            pat,
            TEXTSPLIT(
                TAKE(
                a,
                ,
                -1
            ),
                ,
                ","
            ),
            TEXTJOIN(
                " ",
                TRUE,
                INDEX(
                    name,
                    pat
                )
            )
        )
    )
)
Excel solution 11 for Column Combining! Part 2, proposed by Eddy Wijaya:
=MAP(
    E3:E7,
    LAMBDA(
        m,        LET(
            
            p,
            TEXTSPLIT(
                m,
                ","
            ),
            
            TEXTJOIN(
                " ",
                ,
                INDEX(
                    OFFSET(
                        m,
                        ,
                        -3,
                        1,
                        3
                    ),
                    1,
                    p
                )
            )
        )
    )
)
Excel solution 12 for Column Combining! Part 2, proposed by Fausto Bier:
=BYROW(
    B3:E7,
    LAMBDA(
        x,
        TEXTJOIN(
            " ",
            1,
            INDEX(
                DROP(
                    x,
                    ,
                    -1
                ),
                TEXTSPLIT(
                    TAKE(
                    x,
                    ,
                    -1
                ),
                    ","
                )
            )
        )
    )
)
Excel solution 13 for Column Combining! Part 2, proposed by Gerson Pineda:
=BYROW(
    B3:E7,
    LAMBDA(
        x,
        TEXTJOIN(
            " ",
            ,
            CHOOSECOLS(
                x,
                --TEXTSPLIT(
                    TAKE(
                        x,
                        ,
                        -1
                    ),
                    ","
                )
            )
        )
    )
)
Excel solution 14 for Column Combining! Part 2, proposed by Hussein SATOUR:
=BYROW(
    B3:E7,
    LAMBDA(
        x,
        TEXTJOIN(
            " ",
            ,
            CHOOSECOLS(
                TAKE(
                    x,
                    ,
                    3
                ),
                --TEXTSPLIT(
                    TAKE(
                        x,
                        ,
                        -1
                    ),
                    ","
                )
            )
        )
    )
)
Excel solution 15 for Column Combining! Part 2, proposed by Leonid Koyfman:
=SUBSTITUTE(    REGEXREPLACE(
        E3:E7,
        "(1)|(2)|(3)",
        "
${1:+"&B3:B7&"}
${2:+"&C3:C7&"}
${3:+"&D3:D7&"}
"
    ),
    ",",
    " "
)
Excel solution 16 for Column Combining! Part 2, proposed by Md. Zohurul Islam:
=LET(
    u,
    B3:D7,
    v,
    E3:E7,
    w,
    SEQUENCE(
        ROWS(
            u
        )
    ),
    I,
    INDEX,
    cc,
    CHOOSECOLS,    z,
    MAP(
        w,
        LAMBDA(
            x,
            LET(
                a,
                --TEXTSPLIT(
                    I(
                        v,
                        x,
                        
                    ),
                    ","
                ),
                TEXTJOIN(
                    " ",
                    ,
                    cc(
                        I(
                            u,
                            x,
                            
                        ),
                        a
                    )
                )
            )
        )
    ),    z
)
Excel solution 17 for Column Combining! Part 2, proposed by Meganathan Elumalai:
=BYROW(
    B3:E7,
    LAMBDA(
        x,
        LET(
            a,
            TEXTSPLIT(
                TAKE(
                    x,
                    ,
                    -1
                ),
                ","
            ),
            TEXTJOIN(
                " ",
                ,
                INDEX(
                    x,
                    a
                )
            )
        )
    )
)
Excel solution 18 for Column Combining! Part 2, proposed by Milan Shrimali:
=BYROW(
    B3:E7,
    LAMBDA(
        X,
        LET(
            A,
            TOCOL(
                SPLIT(
                    CHOOSECOLS(
                        X,
                        4
                    ),
                    ","
                )
            ),
            B,
            HSTACK(
                SEQUENCE(
                    COUNT(
                        ARRAYFORMULA(
                            IF(
                                ISBLANK(
                                    CHOOSECOLS(
                                        X,
                                        1,
                                        2,
                                        3
                                    )
                                ),
                                1,
                                1
                            )
                        )
                    ),
                    1,
                    1,
                    1
                ),
                TOCOL(
                                    CHOOSECOLS(
                                        X,
                                        1,
                                        2,
                                        3
                                    )
                                )
            ),
            JOIN(
                " ",
                BYROW(
                    A,
                    LAMBDA(
                        X,
                        FILTER(
                            CHOOSECOLS(
                                B,
                                2
                            ),
                            CHOOSECOLS(
                                B,
                                1
                            )=X
                        )
                    )
                )
            )
        )
    )
)
Excel solution 19 for Column Combining! Part 2, proposed by Nicolas Micot:
=JOINDRE.TEXTE(
    " ";
    VRAI;
    CHOISIRCOLS(
        B3:D3;
        FRACTIONNER.TEXTE(
            E3;
            ;
            ","
        )+0
    )
)
Excel solution 20 for Column Combining! Part 2, proposed by Peter Bartholomew:
= BYROW(
    NameTable,
     SORTNAMEλ
)
where
SORTNAMEλ
= LAMBDA(
    record,     LET(          name,
          TAKE(
              record,
              ,
              3
          ),          pattern,
          TAKE(
              record,
              ,
              -1
          ),          order,
          TEXTSPLIT(
              pattern,
               ","
          ),          result,
          INDEX(
              name,
               order
          ),          TEXTJOIN(
              " ",
               1,
               result
          )     ))
Excel solution 21 for Column Combining! Part 2, proposed by Pieter de B.:
=BYROW(
    B3:E7,
    LAMBDA(
        b,
        TEXTJOIN(
            " ",
            ,
            INDEX(
                b,
                TEXTSPLIT(
                    DROP(
                        b,
                        ,
                        3
                    ),
                    ","
                )
            )
        )
    )
)
Excel solution 22 for Column Combining! Part 2, proposed by Rick Rothstein:
=BYROW(
    B3:E7,
    LAMBDA(
        r,
        TEXTJOIN(
            " ",
            ,
            INDEX(
                r,
                ,
                TEXTSPLIT(
                    TAKE(
                        r,
                        ,
                        -1
                    ),
                    ","
                )
            )
        )
    )
)
Excel solution 23 for Column Combining! Part 2, proposed by Seokho MOON:
=BYROW(
    B3:E7,
    LAMBDA(
        x,
        TEXTJOIN(
            " ",
            ,
            INDEX(
                x,
                TEXTSPLIT(
                    INDEX(
                        x,
                        4
                    ),
                    ","
                )
            )
        )
    )
)
Excel solution 24 for Column Combining! Part 2, proposed by Surendra Reddy:
=BYROW(
    B3:E7,
    LAMBDA(
        x,
        TEXTJOIN(
            " ",
            ,
            CHOOSECOLS(
                x,
                TEXTSPLIT(
                    TAKE(
                        x,
                        ,
                        -1
                    ),
                    ","
                )*1
            )
        )
    )
)

Solving the challenge of Column Combining! Part 2 with Python

Python solution 1 for Column Combining! Part 2, proposed by Konrad Gryczan, PhD:
import pandas as pd

path = "CH-199 Combining the columns.xlsx"
input = pd.read_excel(path, usecols="B:E", skiprows=1, nrows=6)
test = pd.read_excel(path, usecols="H", skiprows=1, nrows=6)

def combine_columns(row):
 first_name, middle_name, last_name, pattern = row
 order = list(map(int, pattern.split(',')))
 names = [first_name, middle_name, last_name]
 return ' '.join([names[i-1] for i in order])

input['Custom Format'] = input.apply(combine_columns, axis=1)
result = input['Custom Format']

print(all(input['Custom Format'] == test['Custom Format'])) # True

_x000D_

Python solution 2 for Column Combining! Part 2, proposed by Luan Rodrigues:
import pandas as pd
Python solution 2 for Column Combining! Part 2, proposed by Luan Rodrigues:

Leave a Reply