Home » Unstack Columns to Rows

Unstack Columns to Rows

Transform the problem table into result table as shown.

📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 243
Challenge Difficulty: ⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Unstack Columns to Rows with Power Query

Power Query solution 1 for Unstack Columns to Rows, proposed by Zoran Milokanović:
let
  Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content], 
  H = Table.ColumnNames(Source), 
  S = Table.Combine(
    List.Combine(
      Table.Group(
        Source, 
        "Emp ID", 
        {
          "G", 
          each List.TransformMany(
            List.Zip(List.Transform([Group], each Text.Split(_, ", "))), 
            each {_}, 
            (i, o) =>
              Table.FromRows(
                {{[Emp ID]{0}} & o}, 
                {H{0}} & List.Transform({1 .. List.Count(o)}, each H{1} & Text.From(_))
              )
          )
        }
      )[G]
    )
  )
in
  S
Power Query solution 2 for Unstack Columns to Rows, proposed by Kris Jaganah:
let
  A = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  B = Table.Group(
    A, 
    {"Emp ID"}, 
    {
      "All", 
      each 
        let
          a = List.Transform([Group], (x) => Text.Split(x, ", "))
        in
          Table.TransformColumnNames(Table.FromColumns(a), each Text.Replace(_, "Column", "Group"))
    }
  ), 
  C = Table.ExpandTableColumn(B, "All", Table.ColumnNames(B[All]{0}))
in
  C
Power Query solution 3 for Unstack Columns to Rows, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content], 
  Group = Table.Group(
    Source, 
    "Emp ID", 
    {
      "A", 
      each [S = List.Transform([Group], (f) => Text.Split(f, ", ")), R = Table.FromColumns(S)][R]
    }
  ), 
  Cols = Table.ColumnNames(Table.Combine(Group[A])), 
  Expand = Table.ExpandTableColumn(Group, "A", Cols), 
  Return = Table.TransformColumnNames(Expand, each Text.Replace(_, "Column", "Group"))
in
  Return
Power Query solution 4 for Unstack Columns to Rows, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Group = Table.Group(
    Source, 
    {"Emp ID"}, 
    {
      {
        "A", 
        each 
          let
            a = _, 
            b = a[Group], 
            c = List.Transform(b, each Text.Split(_, ", ")), 
            d = Table.FromColumns(
              c, 
              List.Transform({1 .. List.Count(b)}, each "Group" & Text.From(_))
            )
          in
            d
      }
    }
  ), 
  Sol = Table.ExpandTableColumn(Group, "A", Table.ColumnNames(Group[A]{0}))
in
  Sol
Power Query solution 5 for Unstack Columns to Rows, proposed by Luan Rodrigues:
let
  Fonte = Tabela1, 
  grp = Table.Group(
    Fonte, 
    {"Emp ID"}, 
    {
      {
        "tab", 
        each 
          let
            a = [Emp ID], 
            b = Table.FromColumns(
              List.Transform(_[Group], (x) => Text.Split(x, ", ")), 
              List.Transform({1 .. List.Count(a)}, (y) => "Group" & Text.From(y))
            ), 
            c = Table.AddColumn(b, "Emp ID", each a{0})
          in
            Table.SelectColumns(c, List.Sort(Table.ColumnNames(c)))
      }
    }
  )[tab], 
  cmb = Table.Combine(grp)
in
  cmb
Power Query solution 6 for Unstack Columns to Rows, proposed by Abdallah Ally:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Group = Table.Group(
    Source, 
    "Emp ID", 
    {
      "Data", 
      each [
        a = List.Zip(List.Transform([Group], (x) => Text.Split(x, ", "))), 
        b = {"Emp ID"} & List.Transform({1 .. List.Count(a{0})}, (x) => "Group" & Text.From(x)), 
        c = Table.Combine(List.Transform(a, (x) => Table.FromRows({{[Emp ID]{0}} & x}, b)))
      ][c]
    }
  ), 
  Result = Table.Combine(Group[Data])
in
  Result
Power Query solution 7 for Unstack Columns to Rows, proposed by Ramiro Ayala Chávez:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  a = Table.Group(S, {"Emp ID"}, {"G", each [Group]}), 
  b = Table.TransformColumns(
    a, 
    {"G", each Table.FromRows(List.Zip(List.Transform(_, each Text.Split(_, ", "))))}
  ), 
  c = Table.ExpandTableColumn(b, "G", {"Column1", "Column2", "Column3"}), 
  Sol = Table.TransformColumnNames(c, each Text.Replace(_, "Column", "Group"))
in
  Sol
Power Query solution 8 for Unstack Columns to Rows, proposed by Eric Laforce:
let
  Source = Excel.CurrentWorkbook(){[Name = "tData243"]}[Content], 
  Group = Table.Group(
    Source, 
    "Emp ID", 
    {
      "G", 
      (t) =>
        let
          _L  = List.Transform(t[Group], each Text.Split(_, ", ")), 
          _CN = List.Transform({1 .. Table.RowCount(t)}, each "Group" & Text.From(_)), 
          _T  = Table.FromColumns({{t[Emp ID]{0}}} & _L, {"Emp ID"} & _CN)
        in
          Table.FillDown(_T, {"Emp ID"})
    }
  ), 
  Result = Table.Combine(Group[G])
in
  Result
Power Query solution 9 for Unstack Columns to Rows, proposed by Seokho MOON:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Grouped = Table.Group(
    Source, 
    {"Emp ID"}, 
    {
      {
        "tbl", 
        each [
          T  = List.Transform([Group], each Text.Split(_, ", ")), 
          CN = {"EMP ID"} & List.Transform({1 .. List.Count(T)}, each "Group" & Text.From(_)), 
          C  = {List.Distinct([Emp ID])} & T, 
          R  = Table.FromColumns(C, CN)
        ][R]
      }
    }
  ), 
  Res = Table.FillDown(Table.Combine(Grouped[tbl]), {"EMP ID"})
in
  Res
Power Query solution 10 for Unstack Columns to Rows, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  A = Table.Group(S, {"Emp ID"}, {{"T", each _}}), 
  F = (x) =>
    let
      a = Table.AddColumn(x, "T", each Text.Split([Group], ", ")), 
      b = Table.FromColumns(
        a[T], 
        List.Transform({1 .. Table.RowCount(a)}, each "Group." & Text.From(_))
      ), 
      c = Table.AddColumn(b, "Emp ID", each a[Emp ID]{0})
    in
      c, 
  B = Table.AddColumn(A, "F", each F([T])), 
  C = Table.Combine(B[F]), 
  D = Table.ReorderColumns(C, {"Emp ID", "Group.1", "Group.2", "Group.3"})
in
  D
Power Query solution 11 for Unstack Columns to Rows, proposed by Peter Krkos:
let
  Transformed = Table.Combine(
    Table.Group(
      Source, 
      {"Emp ID"}, 
      {
        {
          "T", 
          each Table.FillDown(
            Table.FromColumns({{[Emp ID]{0}}} & List.Transform([Group], (x) => Text.Split(x, ", "))), 
            {"Column1"}
          ), 
          type table
        }
      }
    )[T]
  ), 
  RenamedAndType = [
    a = Table.ColumnNames(Transformed), 
    b = {"Emp ID"} & List.Transform({1 .. List.Count(a) - 1}, each "Group " & Text.From(_)), 
    c = Table.RenameColumns(Transformed, List.Zip({a, b})), 
    d = Table.TransformColumnTypes(
      c, 
      {{"Emp ID", Int64.Type}} & List.Transform(List.Skip(b), (x) => {x, type text})
    )
  ][d]
in
  RenamedAndType
Power Query solution 12 for Unstack Columns to Rows, proposed by Khanh Lam chi:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Transcol1 = Table.TransformColumns(Source, {"Group", each Text.Split(_, ", ")}), 
  Sort = Table.Sort(Transcol1, {{"Emp ID", Order.Ascending}}), 
  Group = Table.Group(Sort, {"Emp ID"}, {"Count", each [Group]}), 
  Transcol2 = Table.TransformColumns(
    Group, 
    {
      "Count", 
      (t) =>
        Table.FromColumns(t, List.Transform({1 .. List.Count(t)}, each "Group " & Text.From(_)))
    }
  ), 
  Exp = Table.ExpandTableColumn(
    Transcol2, 
    "Count", 
    Table.ColumnNames(Table.Combine(Transcol2[Count]))
  )
in
  Exp

Solving the challenge of Unstack Columns to Rows with Excel

Excel solution 1 for Unstack Columns to Rows, proposed by Bo Rydobon 🇹🇭:
=LET(
    z,
    A2:A10,
    REDUCE(
        HSTACK(
            A1,
            B1&SEQUENCE(
                ,
                MAX(
                    COUNTIF(
                        z,
                        z
                    )
                )
            )
        ),
        SORT(
            UNIQUE(
                z
            )
        ),
        LAMBDA(
            a,
            v,
            IFNA(
                VSTACK(
                    a,
                    IFNA(
                        HSTACK(
                            v,
                            TRANSPOSE(
                                TEXTSPLIT(
                                    TEXTJOIN(
                                        0,
                                        ,
                                        FILTER(
                                            B2:B10,
                                            z=v
                                        )
                                    ),
                                    ", ",
                                    0,
                                    ,
                                    ,
                                    ""
                                )
                            )
                        ),
                        v
                    )
                ),
                ""
            )
        )
    )
)
Excel solution 2 for Unstack Columns to Rows, proposed by Rick Rothstein:
=DROP(
    IFERROR(
        REDUCE(
            "",
            UNIQUE(
                A2:A10
            ),
            LAMBDA(
                a,
                n,
                VSTACK(
                    a,
                    LET(
                        b,
                        B2:B10,
                        f,
                        FILTER(
                            b,
                            OFFSET(
                                b,
                                ,
                                -1
                            )=n
                        ),
                        t,
                        TRANSPOSE(
                            TEXTSPLIT(
                                TEXTAFTER(
                                    ", "&f,
                                    ", ",
                                    SEQUENCE(
                                        ,
                                        1+MAX(
                                            LEN(
                                                f
                                            )-LEN(
                                                SUBSTITUTE(
                                                    f,
                                                    ",",
                                                    ""
                                                )
                                            )
                                        )
                                    )
                                ),
                                ", "
                            )
                        ),
                        HSTACK(
                            n*SEQUENCE(
                                ROWS(
                                    t
                                ),
                                ,
                                ,
                                0
                            ),
                            t
                        )
                    )
                )
            )
        ),
        ""
    ),
    1
)
Excel solution 3 for Unstack Columns to Rows, proposed by 🇰🇷 Taeyong Shin:
=LET(r,
    REDUCE(
        A1,
        UNIQUE(
            A2:A10
        ),
        LAMBDA(
            a,
            v,
            IFNA(
                VSTACK(
                    a,
                    IFNA(
                        HSTACK(
                            v,
                            TRANSPOSE(
                                TEXTSPLIT(
                                    TEXTJOIN(
                                        "|",
                                        ,
                                        REPT(
                                            B2:B10,
                                            A2:A10=v
                                        )
                                    ),
                                    ", ",
                                    "|",
                                    ,
                                    ,
                                    ""
                                )
                            )
                        ),
                        v
                    )
                ),
                ""
            )
        )
    ),
    IF((r="")*(SEQUENCE(
        ROWS(
            r
        )
    )=1),
    B1&SEQUENCE(
        ,
        COLUMNS(
            r
        ),
        0
    ),
    r))
Excel solution 4 for Unstack Columns to Rows, proposed by Oscar Mendez Roca Farell:
=LET(
    a,
    A2:A11,
    REDUCE(
        HSTACK(
            A1,
            B1&SEQUENCE(
                ,
                MAX(
                    COUNTIF(
                        a,
                        a
                    )
                )
            )
        ),
        UNIQUE(
            a
        ),
        LAMBDA(
            i,
            x,
            IFNA(
                VSTACK(
                    i,
                    IFNA(
                        HSTACK(
                            x,
                            TRANSPOSE(
                                TEXTSPLIT(
                                    CONCAT(
                                        FILTER(
                                            B2:B11,
                                            a=x
                                        )&"|"
                                    ),
                                    ", ",
                                    "|",
                                    1,
                                    ,
                                    ""
                                )
                            )
                        ),
                        x
                    )
                ),
                ""
            )
        )
    )
)
Excel solution 5 for Unstack Columns to Rows, proposed by Duy Tùng:
=LET(
    a,
    DROP(
        REDUCE(
            0,
            SORT(
                UNIQUE(
                    A2:A10
                )
            ),
            LAMBDA(
                x,
                y,
                IFNA(
                    VSTACK(
                        x,
                        IFNA(
                            HSTACK(
                                y,
                                TRANSPOSE(
                                    TEXTSPLIT(
                                        TEXTJOIN(
                                            "/",
                                            ,
                                            FILTER(
                                                B2:B10,
                                                A2:A10=y
                                            )
                                        ),
                                        ", ",
          &                              "/",
                                        ,
                                        ,
                                        ""
                                    )
                                )
                            ),
                            y
                        )
                    ),
                    ""
                )
            )
        ),
        1
    ),
    VSTACK(
        HSTACK(
            A1,
            B1&SEQUENCE(
                ,
                COLUMNS(
                    a
                )-1
            )
        ),
        a
    )
)
Excel solution 6 for Unstack Columns to Rows, proposed by Sunny Baggu:
=LET(
 _u, UNIQUE(A2:A10),
 _r, IFNA(
 DROP(
 REDUCE(
 "💐",
 _u,
 LAMBDA(x, y,
 VSTACK(
 x,
 IFNA(
 HSTACK(
 y,
 IFNA(
 DROP(
 REDUCE(
 "🌼",
 FILTER(B2:B10, A2:A10 = y),
 LAMBDA(a, v, HSTACK(a, TEXTSPLIT(v, , ", ")))
 ),
 ,
 1
 ),
 ""
 )
 ),
 y
 )
 )
 )
 ),
 1
 ),
 ""
 ),
 VSTACK(HSTACK(A1, B1 & SEQUENCE(, COLUMNS(_r) - 1)), _r)
)
Excel solution 7 for Unstack Columns to Rows, proposed by LEONARD OCHEA 🇷🇴:
=LET(
    i,
    A2:A10,
    m,
    SUBSTITUTE(
        B2:B10,
        ", ",
        ""
    ),
    n,
    MAX(
        LEN(
            m
        )
    ),
    s,
    SEQUENCE(
        ,
        n
    ),
    d,
    MID(
        m,
        s,
        1
    ),
    F,
    LAMBDA(
        x,
        TOCOL(
            IFS(
                d>"",
                x
            ),
            3
        )
    ),
    g,
    B1&MAP(
        i,
        LAMBDA(
            x,
            COUNTIF(
                A2:x,
                x
            )
        )
    ),
    p,
    PIVOTBY(
        HSTACK(
            F(
                i
            ),
            F(
                s
            )
        ),
        F(
            g
        ),
        F(
            d
        ),
        SINGLE,
        ,
        0,
        ,
        0
    ),
    HSTACK(
        TAKE(
            p,
            ,
            1
        ),
        DROP(
            p,
            ,
            2
        )
    )
)
Excel solution 8 for Unstack Columns to Rows, proposed by Md. Zohurul Islam:
=LET(
    
     id,
     A2:A10,
    
     grp,
     B2:B10,
    
     u,
     UNIQUE(
         id
     ),
    
     v,
     MAX(
         MAP(
             grp,
              LAMBDA(
                  z,
                   COUNTA(
                       TEXTSPLIT(
                           z,
                            ", "
                       )
                   )
              )
         )
     ),
    
     hdr,
     HSTACK(
         A1,
          B1 & SEQUENCE(
              ,
               v
          )
     ),
    
     w,
     IFNA(
         
          DROP(
              
               REDUCE(
                   
                    "",
                   
                    u,
                   
                    LAMBDA(
                        x,
                         y,
                        
                         LET(
                             
                              a,
                              IFNA(
                                  
                                   DROP(
                                       
                                        REDUCE(
                                            
                                             "",
                                            
                                             FILTER(
                                                 grp,
                                                  id = y
                                             ),
                                            
                                             LAMBDA(
                                                 p,
                                                  q,
                                                 
                                                  HSTACK(
                                                      p,
                                                       TEXTSPLIT(
                                                           q,
                                                            ,
                                                            ", "
                                                       )
                                                  )
                                                  
                                             )
                                             
                                        ),
                                       
                                        ,
                                       
                                        1
                                        
                                   ),
                                  
                                   ""
                                   
                              ),
                             
                              b,
                              IFNA(
                                  HSTACK(
                                      y,
                                       a
                                  ),
                                   y
                              ),
                             
                              d,
                              VSTACK(
                                  x,
                                   b
                              ),
                             
                              d
                              
                         )
                         
                    )
                    
               ),
              
               1
               
          ),
         
          ""
          
     ),
    
     result,
     VSTACK(
         hdr,
          w
     ),
    
     result
    
)
Excel solution 9 for Unstack Columns to Rows, proposed by Asheesh Pahwa:
=LET(
    e,
    A2:A10,
    g,
    B2:B10,
    u,
    UNIQUE(
        e
    ),
    I,
    IFNA(
        DROP(
            REDUCE(
                "",
                u,
                LAMBDA(
                    x,
                    y,
                    VSTACK(
                        x,
                        LET(
                            f,
                            FILTER(
                                g,
                                e=y
                            ),
                            HSTACK(
                                y,
                                DROP(
                                    REDUCE(
                                        "",
                                        f,
                                        LAMBDA(
                                            a,
                                            v,
                                            HSTACK(
                                                a,
                                                TEXTSPLIT(
                                                    v,
                                                    ,
                                                    ", "
                                                )
                                            )
                                        )
                                    ),
                                    ,
                                    1
                                )
                            )
                        )
                    )
                )
            ),
            1
        ),
        ""
    ),
    
    HSTACK(
        SCAN(
            "",
            TAKE(
                I,
                ,
                1
            ),
            LAMBDA(
                x,
                y,
                IF(
                    ISNUMBER(
                        y
                    ),
                    y,
                    x
                )
            )
        ),
        DROP(
                I,
                ,
                1
            )
    )
)
Excel solution 10 for Unstack Columns to Rows, proposed by Jaroslaw Kujawa:
=DROP(IFNA(REDUCE("";
    UNIQUE(
        A2:A10
    );
    LAMBDA(a;
    x;
    LET(xx;
    A2:B10;
    y;
    FILTER(
        xx;
        TAKE(
            xx;
            ;
            1
        )=x
    );
    nc;
    (LEN(
        TAKE(
            y;
            ;
            -1
        )
    )-LEN(
        SUBSTITUTE(
            TAKE(
            y;
            ;
            -1
        );
            ", ";
            
        )
    ))/LEN(
        ", "
    );
    max;
    MAX((LEN(
        TAKE(
            y;
            ;
            -1
        )
    )-LEN(
        SUBSTITUTE(
            TAKE(
            y;
            ;
            -1
        );
            ", ";
            
        )
    ))/LEN(
        ", "
    ));
    bt;
    TEXTSPLIT(
        CONCAT(
            TAKE(
            y;
            ;
            -1
        )&REPT(
            ", ";
            max-nc
        )&";"
        );
        ", ";
        ";"
    );
    VSTACK(
        a;
        DROP(
            TRANSPOSE(
                VSTACK(
                    1*TEXTSPLIT(
                        REPT(
                            x&", ";
                            COLUMNS(
                                bt
                            )
                        );
                        ", "
                    );
                    bt
                )
            );
            -1;
            -1
        )
    ))));
    "");
    1)
Excel solution 11 for Unstack Columns to Rows, proposed by Songglod P.:
=REDUCE(
    {"Emp ID",
    "Group 1",
    "Group 2",
    "Group 3"},
    UNIQUE(
        A2:A10
    ),
    LAMBDA(
        a,
        v,
        LET(
            g,
            FILTER(
                B2:B10,
                A2:A10=v
            ),
            t,
            DROP(
                REDUCE(
                    0,
                    g,
                    LAMBDA(
                        a,
                        v,
                        HSTACK(
                            a,
                            TOCOL(
                                TEXTSPLIT(
                                    v,
                                    ", "
                                )
                            )
                        )
                    )
                ),
                ,
                1
            ),
            IFNA(
                VSTACK(
                    a,
                    HSTACK(
                        SEQUENCE(
                            ROWS(
                                t
                            ),
                            ,
                            v,
                            0
                        ),
                        t
                    )
                ),
                ""
            )
        )
    )
)

Solving the challenge of Unstack Columns to Rows with Python

Python solution 1 for Unstack Columns to Rows, proposed by Konrad Gryczan, PhD:
import pandas as pd
path = "PQ_Challenge_243.xlsx"
input = pd.read_excel(path,usecols="A:B", nrows=9)
test = pd.read_excel(path, usecols="D:G", nrows=12).rename(columns=lambda x: x.split('.')[0])
input['Group_2'] = input.groupby('Emp ID').cumcount().add(1).astype(str).radd('Group')
input = input.sort_values('Emp ID').assign(Group=input['Group'].str.split(', ')).explode('Group')
input['x'] = input.groupby(['Emp ID', 'Group_2']).cumcount().add(1)
pivot_table = input.pivot_table(index=['Emp ID', 'x'], columns='Group_2', values='Group', aggfunc='first')
pivot_table = pivot_table.reset_index().drop(columns='x').rename_axis(None, axis=1)
print(pivot_table.equals(test)) # True
                    
                  
Python solution 2 for Unstack Columns to Rows, proposed by Luan Rodrigues:
import pandas as pd
file = "PQ_Challenge_243.xlsx"
df = pd.read_excel(file,usecols="A:B")
def tab(x):
 a = pd.DataFrame([i.split(', ') for i in x['Group'] ]).T
 b = ["Group"+str(i) for i in range(1,len(a.columns)+1)]
 c = a.rename(columns=dict(zip(a.columns,b)))
 return c 
grp = df.groupby('Emp ID').apply(tab).reset_index()
del grp['level_1'] 
 
print(grp)
                    
                  

Solving the challenge of Unstack Columns to Rows with Python in Excel

Python in Excel solution 1 for Unstack Columns to Rows, proposed by Alejandro Campos:
data = xl("A1:B10", headers=True)
final_result = (
 data.groupby("Emp ID")["Group"]
 .apply(lambda x: pd.DataFrame([row.split(", ") for row in x]).T)
 .fillna("")
 .rename(columns=lambda i: f"Group{i+1}")
 .reset_index(level=1, drop=True)
 .reset_index()
)
final_result
                    
                  
Python in Excel solution 2 for Unstack Columns to Rows, proposed by Aditya Kumar Darak 🇮🇳:
data = xl("A1:B10", headers=True)
def MyFun(d):
 split = [i.split(", ") for i in d["Group"]]
 return pd.DataFrame(split).transpose()
group = data.groupby("Emp ID").apply(MyFun).fillna("")
group.columns = [f"Group{i+1}" for i in group.columns]
result = group.reset_index().drop(columns="level_1")
result
                    
                  

Solving the challenge of Unstack Columns to Rows with R

R solution 1 for Unstack Columns to Rows, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "Power Query/PQ_Challenge_243.xlsx"
input = read_excel(path, range = "A1:B10")
test = read_excel(path, range = "D1:G12")
result = input %>%
 mutate(Group_2 = paste0("Group", row_number()), .by = `Emp ID`) %>%
 arrange(`Emp ID`) %>%
 separate_rows(Group, sep = ", ") %>%
 mutate(x = row_number(), .by = c(`Emp ID`, Group_2)) %>%
 pivot_wider(names_from = Group_2, values_from = Group) %>%
 select(-x)
all.equal(result, test)
#> [1] TRUE
                    
                  

&&

Leave a Reply