Home » Shift Rows into Columns

Shift Rows into Columns

Transpose the problem table into result table.

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

Solving the challenge of Shift Rows into Columns with Power Query

Power Query solution 1 for Shift Rows into Columns, proposed by Zoran Milokanović:
let
  Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content], 
  S = Table.FromRows(
    List.TransformMany(
      Table.ToRows(Table.Group(Source, {"Group", "Dept"}, {"A", each [[Emp ID], [Name]]})), 
      each {{_{0}, _{1}}} & Table.ToRows(_{2}), 
      (i, _) => _
    )
  )
in
  S
Power Query solution 2 for Shift Rows into Columns, proposed by Kris Jaganah:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Ans = Table.Combine(
    Table.Group(
      Source, 
      {"Group"}, 
      {
        "All", 
        each Table.DemoteHeaders(
          Table.RenameColumns(_, {{"Name", [Dept]{0}}, {"Emp ID", [Group]{0}}})
        )[[Column1], [Column2]]
      }
    )[All]
  )
in
  Ans
Power Query solution 3 for Shift Rows into Columns, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Sol = Table.Combine(
    Table.Group(
      Source, 
      {"Dept", "Group"}, 
      {
        {
          "A", 
          (x) =>
            let
              a = {Table.ToRows(x[[Group], [Dept]]){0}} & Table.ToRows(x[[Emp ID], [Name]]), 
              b = Table.FromRows(a)
            in
              b
        }
      }
    )[A]
  )
in
  Sol
Power Query solution 4 for Shift Rows into Columns, proposed by Luan Rodrigues:
let
  Fonte = Tabela1, 
  grp = Table.Group(
    Fonte, 
    {"Group"}, 
    {
      {
        "tab", 
        each 
          let
            a = _[[Emp ID], [Name]], 
            b = Table.RenameColumns(a, {{"Emp ID", _[Group]{0}}, {"Name", _[Dept]{0}}})
          in
            Table.DemoteHeaders(b)
      }
    }
  )[tab], 
  res = Table.Combine(grp)
in
  res
Power Query solution 5 for Shift Rows into Columns, proposed by Hussein SATOUR:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Groupe = Table.Group(
    Source, 
    {"Group", "Dept"}, 
    {
      {
        "All", 
        each 
          let
            a = [Group], 
            b = [Dept]
          in
            List.Combine({{List.First(List.Zip({a, b}))}, List.Zip({_[Emp ID], _[Name]})})
      }
    }
  ), 
  ExpendExtract = Table.TransformColumns(
    Table.ExpandListColumn(Groupe, "All"), 
    {"All", each Text.Combine(List.Transform(_, Text.From), ",")}
  ), 
  SplitCols = Table.SplitColumn(
    ExpendExtract, 
    "All", 
    Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), 
    {"Column1", "Column2"}
  ), 
  RemovCols = Table.RemoveColumns(SplitCols, {"Group", "Dept"})
in
  RemovCols
Power Query solution 6 for Shift Rows into Columns, proposed by Abdallah Ally:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Transform = List.Transform(
    List.Distinct(Source[Dept]), 
    each [
      a = Table.SelectRows(Source, (x) => x[Dept] = _), 
      b = {{a{0}[Group], a{0}[Dept]}} & Table.ToRows(a[[Emp ID], [Name]])
    ][b]
  ), 
  Result = Table.FromRows(List.Combine(Transform))
in
  Result
Power Query solution 7 for Shift Rows into Columns, proposed by 🇵🇪 Ned Navarrete C.:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Grouped = Table.Combine(
    Table.Group(
      Source, 
      {"Group"}, 
      {
        "X", 
        each [
          a = Table.ToRows(Table.Distinct([[Group], [Dept]])), 
          b = Table.ToRows([[Emp ID], [Name]]), 
          c = Table.FromRows(a & b)
        ][c]
      }
    )[X]
  )
in
  Grouped
Power Query solution 8 for Shift Rows into Columns, proposed by Eric Laforce:
let
  Source = Excel.CurrentWorkbook(){[Name = "tData225"]}[Content], 
  Group = Table.Group(
    Source, 
    {"Group", "Dept"}, 
    {
      "G", 
      each Table.FromRows(
        {Record.FieldValues(_{0}[[Group], [Dept]])} & Table.ToRows([[Emp ID], [Name]])
      )
    }
  ), 
  Combine = Table.Combine(Group[G])
in
  Combine
Power Query solution 9 for Shift Rows into Columns, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  a = Table.Group(Source, {"Dept", "Group"}, {{"T", each _}}), 
  b = Table.AddColumn(
    a, 
    "C", 
    each 
      let
        A = {[Group]} & [T][Emp ID], 
        B = {[Dept]} & [T][Name], 
        C = Table.FromColumns({A, B})
      in
        C
  ), 
  c = Table.SelectColumns(b, {"C"}), 
  d = Table.ExpandTableColumn(c, "C", {"Column1", "Column2"}, {"Column1", "Column2"})
in
  d
Power Query solution 10 for Shift Rows into Columns, proposed by Luke Jarych:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Grouped = Table.Group(
    Source, 
    {"Group"}, 
    {
      {
        "All", 
        each 
          let
            a = Table.RenameColumns(_, {{"Name", [Dept]{0}}, {"Emp ID", [Group]{0}}}), 
            b = Table.DemoteHeaders(a)
          in
            b[[Column1], [Column2]]
      }
    }
  ), 
  Com = Table.Combine(Grouped[All])
in
  Com
Power Query solution 11 for Shift Rows into Columns, proposed by Sandeep Marwal:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  #"Grouped Rows" = Table.Group(
    Source, 
    {"Dept", "Group"}, 
    {
      {
        "Count", 
        each Table.InsertRows(_[[Emp ID], [Name]], 0, {[Emp ID = [Group]{0}, Name = [Dept]{0}]})
      }
    }
  ), 
  #"Expanded Count" = Table.ExpandTableColumn(
    #"Grouped Rows", 
    "Count", 
    {"Emp ID", "Name"}, 
    {"Column1", "Column2"}
  ), 
  #"Removed Columns" = Table.RemoveColumns(#"Expanded Count", {"Dept", "Group"})
in
  #"Removed Columns"
Power Query solution 12 for Shift Rows into Columns, proposed by Francesco Bianchi 🇮🇹:
let
 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
 Sol = Table.Combine( Table.Group(Source, {"Group"}, {{"All", each 
 hashtag#table(null,{{_[Group]{0},_[Dept]{0}}})&Table.FromColumns(List.FirstN(Table.ToColumns (_),2))}})[All])
in
 Sol


                    
                  
          
Power Query solution 13 for Shift Rows into Columns, proposed by Sanket Doijode:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  #"Grouped Rows" = Table.ExpandTableColumn(
    Table.SelectColumns(
      Table.Group(
        Source, 
        {"Group"}, 
        {
          {
            "Count", 
            each Table.RenameColumns(
              Table.SelectColumns(
                Table.InsertRows(
                  _, 
                  0, 
                  {[Emp ID = _{1}[Group], Name = _{1}[Dept], Dept = null, Group = null]}
                ), 
                {"Emp ID", "Name"}
              ), 
              {{"Emp ID", "Column1"}, {"Name", "Column2"}}
            )
          }
        }
      ), 
      "Count"
    ), 
    "Count", 
    {"Column1", "Column2"}
  )
in
  #"Grouped Rows"
Power Query solution 14 for Shift Rows into Columns, proposed by Sahan Jayasuriya:
let
  Source = Excel.CurrentWorkbook(){[Name = "Data"]}[Content], 
  GroupedRows = Table.Group(
    Source, 
    {"Group", "Dept"}, 
    {{"Name List", each _[Emp ID]}, {"Emp ID LIst", each _[Name]}}
  ), 
  RowsToList = Table.ToRows(GroupedRows), 
  ListCombine_1 = {
    List.Transform(RowsToList, each {_{0}} & _{2}), 
    List.Transform(RowsToList, each {_{1}} & _{3})
  }, 
  ListCombine_2 = List.Transform(ListCombine_1, each List.Combine(_)), 
  ColsToTable = Table.FromColumns(ListCombine_2)
in
  ColsToTable
Power Query solution 15 for Shift Rows into Columns, proposed by Daniel Madhadha:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table5"]}[Content], 
  #"Grouped Rows" = Table.Group(
    Source, 
    {"Dept", "Group"}, 
    {{"A", each _, type table [Emp ID = number, Name = text, Dept = text, Group = text]}}
  ), 
  #"Added Custom" = Table.AddColumn(
    #"Grouped Rows", 
    "Res", 
    each 
      let
        X = {[Group]} & [A][Emp ID], 
        Y = {[Group]} & [A][Name], 
        Z = Table.FromColumns({X, Y})
      in
        Z
  ), 
  #"Removed Columns" = Table.RemoveColumns(#"Added Custom", {"Dept", "Group", "A"}), 
  #"Expanded Res" = Table.ExpandTableColumn(
    #"Removed Columns", 
    "Res", 
    {"Column1", "Column2"}, 
    {"Res.Column1", "Res.Column2"}
  ), 
  #"Promoted Headers" = Table.PromoteHeaders(#"Expanded Res", [PromoteAllScalars = true]), 
  #"Changed Type" = Table.TransformColumnTypes(
    #"Promoted Headers", 
    {{"Group A", type any}, {"Group A_1", type text}}
  )
in
  #"Changed Type"

Solving the challenge of Shift Rows into Columns with Excel

Excel solution 1 for Shift Rows into Columns, proposed by Bo Rydobon 🇹🇭:
=LET(
    g,
    D2:D9&"_"&C2:C9,
    DROP(
        REDUCE(
            0,
            UNIQUE(
                g
            ),
            LAMBDA(
                a,
                v,
                VSTACK(
                    a,
                    TEXTSPLIT(
                        v,
                        "_"
                    ),
                    FILTER(
                        A2:B9,
                        g=v
                    )
                )
            )
        ),
        1
    )
)
Excel solution 2 for Shift Rows into Columns, proposed by Rick Rothstein:
=DROP(
    REDUCE(
        0,
        UNIQUE(
            D2:D9
        ),
        LAMBDA(
            a,
            x,
            LET(
                f,
                FILTER(
                    A2:D9,
                    D2:D9=x
                ),
                VSTACK(
                    a,
                    INDEX(
                        f,
                        ,
                        {4,
                        3}
                    ),
                    TAKE(
                        f,
                        ,
                        2
                    )
                )
            )
        )
    ),
    1
)

With headers...
=REDUCE(
    "Column"&{1,
    2},
    UNIQUE(
            D2:D9
        ),
    LAMBDA(
            a,
            x,
            LET(
                f,
                FILTER(
                    A2:D9,
                    D2:D9=x
                ),
                VSTACK(
                    a,
                    INDEX(
                        f,
                        ,
                        {4,
                        3}
                    ),
                    TAKE(
                        f,
                        ,
                        2
                    )
                )
            )
        )
)
Excel solution 3 for Shift Rows into Columns, proposed by 🇰🇷 Taeyong Shin:
=WRAPROWS(TOCOL(HSTACK(IFS(D2:D9<>DROP(VSTACK(0,D2:D9),-1),CHOOSECOLS(C2:D9,2,1)),A2:B9),2),2)
Excel solution 4 for Shift Rows into Columns, proposed by Kris Jaganah:
=REDUCE(
    "Column"&{1,
    2},
    UNIQUE(
        D2:D9
    ),
    LAMBDA(
        x,
        y,
        VSTACK(
            x,
            LET(
                a,
                FILTER(
                    A2:D9,
                    D2:D9=y
                ),
                VSTACK(
                    TAKE(
                        CHOOSECOLS(
                            a,
                            4,
                            3
                        ),
                        1
                    ),
                    TAKE(
                        a,
                        ,
                        2
                    )
                )
            )
        )
    )
)
Excel solution 5 for Shift Rows into Columns, proposed by Julian Poeltl:
=LET(
    D,
    C2:C9,
    R,
    WRAPROWS(
        TEXTSPLIT(
            TEXTJOIN(
                ",",
                ,
                MAP(
                    UNIQUE(
                        D
                    ),
                    LAMBDA(
                        A,
                        TEXTJOIN(
                            ",",
                            ,
                            TAKE(
                                FILTER(
                                    HSTACK(
                                        D2:D9,
                                        D
                                    ),
                                    D=A
                                ),
                                1
                            ),
                            FILTER(
                                A2:B9,
                                D=A
                            )
                        )
                    )
                )
            ),
            ","
        ),
        2
    ),
    IFERROR(
        R*1,
        R
    )
)
Excel solution 6 for Shift Rows into Columns, proposed by Oscar Mendez Roca Farell:
=TEXTSPLIT(CONCAT(GROUPBY(D2:D9&"|"&C2:C9,A2:A9&"|"&B2:B9,ARRAYTOTEXT,,0)&", "),"|",", ",1)
Excel solution 7 for Shift Rows into Columns, proposed by Duy Tùng:
=DROP(
    REDUCE(
        0,
        UNIQUE(
            D2:D9&"/"&C2:C9
        ),
        LAMBDA(
            x,
            y,
            VSTACK(
                x,
                VSTACK(
                    TEXTSPLIT(
                        y,
                        "/"
                    ),
                    FILTER(
                        A2:B9,
                        D2:D9&"/"&C2:C9=y
                    )
                )
            )
        )
    ),
    1
)
Excel solution 8 for Shift Rows into Columns, proposed by Sunny Baggu:
=REDUCE(
    
     "Column" & {1,
     2},
    
     UNIQUE(
         D2:D9
     ),
    
     LAMBDA(
         x,
          y,
         
          VSTACK(
              
       &        x,
              
               VSTACK(
                   
                    HSTACK(
                        y,
                         XLOOKUP(
                             y,
                              D2:D9,
                              C2:C9
                         )
                    ),
                   
                    FILTER(
                        A2:B9,
                         D2:D9 = y
                    )
                    
               )
               
          )
          
     )
    
)
Excel solution 9 for Shift Rows into Columns, proposed by LEONARD OCHEA 🇷🇴:
=LET(
    t,
    A2:D9,
    UNIQUE(
        WRAPROWS(
            TOCOL(
                CHOOSECOLS(
                    t,
                    4,
                    3,
                    1,
                    2
                )
            ),
            2
        )
    )
)
Excel solution 10 for Shift Rows into Columns, proposed by 🇵🇪 Ned Navarrete C.:
=TEXTSPLIT(TEXTJOIN("|",,BYROW(GROUPBY(D2:D9&"-"&C2:C9,"|"&A2:A9&"-"&B2:B9,CONCAT,,0),CONCAT)),"-","|")
Excel solution 11 for Shift Rows into Columns, proposed by Hamidi Hamid:
=LET(
    aa,
    A2:A9,
    bb,
    B2:B9,
    cc,
    C2:C9,
    dd,
    D2:D9,
    a,
    IF(
        aa=A1:A8,
        "",
        A2:A9
    ),
    b,
    IF(
        bb=B1:B8,
        "",
        bb
    ),
    c,
    IF(
        cc=C1:C8,
        1/0,
        C2:C9
    ),
    d,
    IF(
        D1:D8=dd,
        1/0,
        dd
    ),
    gu,
    TOCOL(
        IF(
            ISBLANK(
                d
            ),
            1/0,
            HSTACK(
                d,
                a
            )
        ),
        3
    ),
    dc,
    TOCOL(
        HSTACK(
            c,
            b
        ),
        3
    ),
    HSTACK(
        gu,
        dc
    )
)
Excel solution 12 for Shift Rows into Columns, proposed by Asheesh Pahwa:
=LET(
    g,
    D2:D9,
    u,
    UNIQUE(
        g
    ),
    DROP(
        REDUCE(
            "",
            u,
            LAMBDA(
                x,
                y,
                
                VSTACK(
                    x,
                    LET(
                        f,
                        FILTER(
                            A2:C9,
                            g=y
                        ),
                        t,
                        TAKE(
                            f,
                            ,
                            2
                        ),
                        VSTACK(
                            HSTACK(
                                y,
                                TAKE(
                                    f,
                                    1,
                                    -1
                                )
                            ),
                            t
                        )
                    )
                )
            )
        ),
        1
    )
)
Excel solution 13 for Shift Rows into Columns, proposed by ferhat CK:
=LET(
    a,
    D2:D9,
    b,
    C2:C9,
    c,
    A2:B9,
    REDUCE(
        {"Column1",
        "Column2"},
        UNIQUE(
            a
        ),
        LAMBDA(
            x,
            y,
            VSTACK(
                x,
                LET(
                    q,
                    HSTACK(
                        y,
                        UNIQUE(
                            FILTER(
                                b,
                                a=y
                            )
                        )
                    ),
                    VSTACK(
                        q,
                        FILTER(
                            c,
                            a=y
                        )
                    )
                )
            )
        )
    )
)
Excel solution 14 for Shift Rows into Columns, proposed by Ankur Sharma:
=LET(a, D2:D9 & "-" & C2:C9, TEXTSPLIT(TEXTJOIN(" : ", , MAP(UNIQUE(a), LAMBDA(z, TEXTJOIN(" : ", , z, FILTER(A2:A9 & "-" & B2:B9, a = z))))), "-", " : "))
Excel solution 15 for Shift Rows into Columns, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=LET(
    i;
    D2:D9;
    o;
    A2:A9;
    y;
    LAMBDA(
        q;
        w;
        e;
        TEXTJOIN(
            ",";
            ;
            IF(
                q=1;
                VSTACK(
                    e;
                    w
                );
                w
            )
        )
    );
    j;
    BYROW(
        VALUE(
            DROP(
                TRANSPOSE(
                    TEXTSPLIT(
                        TEXTJOIN(
                            ;
                            ;
                            BYROW(
                                MAP(
                                    UNIQUE(
                                        i
                                    );
                                    LAMBDA(
                                        x;
                                        MINIFS(
                                            o;
                                            i;
                                            x
                                        )
                                    )
                                );
                                LAMBDA(
                                    j;
                                    TEXTJOIN(
                                        ",";
                                        ;
                                        IF(
                                            j=o;
                                            1;
                                            0
                                        )
                                    )&"/"
                                )
                            )
                        );
                        ",";
                        "/"
                    )
                );
                ;
                -1
            )
        );
        LAMBDA(
            a;
            SUM(
                a
            )
        )
    );
    HSTACK(
        TEXTSPLIT(
            TEXTJOIN(
                ",";
                ;
                MAP(
                    j;
                    o;
                    i;
                    y
                )
            );
            ;
            ","
        );
        TEXTSPLIT(
            TEXTJOIN(
                ",";
                ;
                MAP(
                    j;
                    B2:B9;
                    C2:C9;
                    y
                )
            );
            ;
            ","
        )
    )
)
Excel solution 16 for Shift Rows into Columns, proposed by Imam Hambali:
=LET(
    
    g,
     D2:D9,
    
    d,
     C2:C9,
    
    u,
     UNIQUE(
         HSTACK(
             g,
             d
         )
     ),
    
    dr,
     DROP(
         REDUCE(
             "",
              TAKE(
                  u,
                  ,
                  1
              ),
              LAMBDA(
                  x,
                  y,
                   VSTACK(
                       x,
                        TOROW(
                            FILTER(
                                A2:B9,
                                 D2:D9=y
                            )
                        )
                   )
              )
         ),
         1
     ),
    
    VSTACK(
        F1:G1,
        WRAPROWS(
            TOROW(
                HSTACK(
                    u,
                    dr
                ),
                3
            ),
            2
        )
    )
    
)
Excel solution 17 for Shift Rows into Columns, proposed by Eddy Wijaya:
=LET(
    
    d,
    A2:D9,
    
    gr,
    TAKE(
        d,
        ,
        -1
    ),
    
    REDUCE(
        F1:G1,
        UNIQUE(
            gr
        ),
        LAMBDA(
            a,
            v,
            VSTACK(
                a,
                VSTACK(
                    HSTACK(
                        v,
                        XLOOKUP(
                            v,
                            gr,
                            CHOOSECOLS(
                                d,
                                3
                            )
                        )
                    ),
                    DROP(
                        FILTER(
                            d,
                            gr=v
                        ),
                        ,
                        -2
                    )
                )
            )
        )
    )
)
Excel solution 18 for Shift Rows into Columns, proposed by Ziad A.:
=ARRAYFORMULA(
    SPLIT(
        UNIQUE(
            TOCOL(
                {D2:D9&"❅"&C2:C9,
                A2:A9&"❅"&B2:B9}
            )
        ),
        "❅"
    )
)
Excel solution 19 for Shift Rows into Columns, proposed by RIJESH T.:
=REDUCE(
    F1:G1,
    UNIQUE(
        D2:D9
    ),
    
    LAMBDA(
        a,
        b,
        LET(
            f,
            FILTER(
                A2:D9,
                D2:D9=b
            ),
            
            VSTACK(
                a,
                TAKE(
                    CHOOSECOLS(
                        f,
                        4,
                        3
                    ),
                    1
                ),
                CHOOSECOLS(
                    f,
                    1,
                    2
                )
            )
            
        )
    )
)
Excel solution 20 for Shift Rows into Columns, proposed by Songglod P.:
=LET(
    g,
    D2:D9,
    d,
    HSTACK(
        g,
        C2:C9
    ),
    DROP(
        REDUCE(
            0,
            UNIQUE(
                g
            ),
            LAMBDA(
                a,
                v,
                VSTACK(
                    a,
                    UNIQUE(
                        FILTER(
                            d,
                            g=v
                        )
                    ),
                    FILTER(
                        A2:B9,
                        g=v
                    )
                )
            )
        ),
        1
    )
)
Excel solution 21 for Shift Rows into Columns, proposed by Hazem Hassan:
=UNIQUE(WRAPROWS(TOCOL(HSTACK(D2:D9,C2:C9,A2:B9)),2))

Solving the challenge of Shift Rows into Columns with Python

Python solution 1 for Shift Rows into Columns, proposed by Konrad Gryczan, PhD:
import pandas as pd
path = "PQ_Challenge_225.xlsx"
input = pd.read_excel(path, usecols="A:D", nrows=8)
test = pd.read_excel(path, usecols="F:G", nrows=12)
input['Id'] = input['Group'].ne(input['Group'].shift()).cumsum().astype(str)
input['Group'] = input['Group'].replace('Group A', 'GroupA')
r1_1 = input.iloc[:, [0, 1, 4]].rename(columns={input.columns[0]: 'Column1', input.columns[1]: 'Column2', 'Id': 'ID'})
r1_2 = input.iloc[:, [3, 2, 4]].rename(columns={input.columns[3]: 'Column1', input.columns[2]: 'Column2', 'Id': 'ID'})
r2 = pd.concat([r1_2, r1_1]).sort_values(by='ID').drop_duplicates().drop(columns='ID').reset_index(drop=True)
print(r2.equals(test)) # True
                    
                  
Python solution 2 for Shift Rows into Columns, proposed by Luan Rodrigues:
PY Solution!
import pandas as pd
file = "PQ_Challenge_225.xlsx"
df = pd.read_excel(file,usecols="A:D")
def fx(tab):
 a = tab[['Emp ID', 'Name']]
 b = tab[['Group', 'Dept']]
 c = pd.concat([b,a])
 return c
result = df.groupby('Group').apply(fx).reset_index(drop=True)
result['Name'] = result.apply(lambda x: x['Dept'] if pd.isna(x['Name']) else x['Name'], axis=1)
result['Emp ID'] = result.apply(lambda x: x['Group'] if pd.isna(x['Emp ID']) else x['Emp ID'], axis=1)
res = result.iloc[:,2:].drop_duplicates()
res.columns = ['Column1','Column2']
print(res)
                    
                  
Python solution 3 for Shift Rows into Columns, proposed by Luke Jarych:
import pandas as pd
import xlwings as xw
wb = xw.Book(r'Grouping table.xlsx')
sh = wb.sheets[0]
table1 = sh.tables['Table1']
rng1 = sh.range(table1.range.address)
df = rng1.options(pd.DataFrame, header=True, index=False, numbers=float).value
def process_group(group):
 initial_row = [group['Group'].iloc[0], group['Dept'].iloc[0]]
 employee_rows = group[['Emp ID', 'Name']].values.tolist()
 combined_rows = [initial_row] + employee_rows
 return combined_rows
grouped = df.groupby(['Group', 'Dept']).apply(process_group)
new_data = [item for sublist in grouped for item in sublist]
new_df = pd.DataFrame(new_data, columns=['Column1', 'Column2'])
new_df['Column1'] = new_df['Column1'].apply(lambda x: int(x) if isinstance(x, float) else x)
new_df
                    
                  

Solving the challenge of Shift Rows into Columns with Python in Excel

Python in Excel solution 1 for Shift Rows into Columns, proposed by Alejandro Campos:
df = xl("A1:D9", headers=True)
transformed_data = []
for group, group_data in df.groupby(['Group', 'Dept']):
 group_name, dept_name = group
 transformed_data.append([group_name, dept_name])
 
 for _, row in group_data.iterrows():
 transformed_data.append([row['Emp ID'], row['Name']])
transformed_df = pd.DataFrame(transformed_data, columns=['Column1', 'Column2'])
transformed_df
                    
                  
Python in Excel solution 2 for Shift Rows into Columns, proposed by Abdallah Ally:
df = xl("A1:D9", headers=True)
# Perform data manipulation
dfs = []
for group in df['Group'].unique():
 dfg = df[df['Group'] == group]
 dept = dfg['Dept'].values[0]
 top = pd.DataFrame({'Emp ID': [group], 'Name': [dept]})
 dfs.append(pd.concat([top, dfg.iloc[:, :2]]))
df = pd.concat(dfs, ignore_index=True)
df.columns = ['Column1', 'Column2']
df
                    
                  
Python in Excel solution 3 for Shift Rows into Columns, proposed by Victor Wang:
tbl = df.groupby(['Group', 'Dept'])
col1 = []
col2 = []
for (group, dept), rows in tbl:
 col1 += [group]
 col1 += rows['Emp ID'].tolist()
 col2 += [dept]
 col2 += rows['Name'].tolist()
 
pd.DataFrame({'Column1': col1, 'Column2': col2})
                    
                  
Python in Excel solution 4 for Shift Rows into Columns, proposed by Ümit Barış Köse, MSc:
df=xl("A2:D10", headers=True)
df_result = df.groupby('Group').apply(
 lambda group_data: [[group_data.name.replace(' ', '')] + [group_data['Dept'].iloc[0]]] + 
 group_data[['Emp ID', 'Name']].values.tolist()
).explode().tolist()
df_result = pd.DataFrame(df_result, columns=['Column1', 'Column2'])
                    
                  

Solving the challenge of Shift Rows into Columns with R

R solution 1 for Shift Rows into Columns, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "Power Query/PQ_Challenge_225.xlsx"
input = read_excel(path, range = "A1:D9")
test = read_excel(path, range = "F1:G12")
r1 = input %>%
 mutate(Id = consecutive_id(Group),
 `Emp ID` = as.character(`Emp ID`),
 Group = ifelse(Group == "Group A", "GroupA", Group))
r1_1 = r1 %>% select(Column1 = 1, Column2 = 2, ID = 5)
r1_2 = r1 %>% select(Column1 = 4, Column2 = 3, ID = 5)
r2 = rbind(r1_2, r1_1) %>%
 arrange(ID) %>%
 distinct() %>%
 select(-ID)
all.equal(r2, test, check.attributes = FALSE)
#> [1] TRUE
                    
                  

&

Leave a Reply