Home » Transpose the data as shown

Transpose the data as shown

Transpose the data as shown.

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

Solving the challenge of Transpose the data as shown with Power Query

Power Query solution 1 for Transpose the data as shown, proposed by Kris Jaganah:
let
  A = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  B = List.Transform(
    Table.ToColumns(A), 
    (v) =>
      Text.Split(
        Text.Combine(List.Transform(v, each if _ = null then "" else Text.From(_)), ", "), 
        ", "
      )
  ), 
  C = List.Accumulate(B{0}, {}, (x, y) => x & {if Text.Length(y) > 1 then y else List.Last(x)}), 
  D = Table.FromRows(
    List.Select(List.Zip({C} & B), (w) => w{2} <> ""), 
    {"Country", "Data1", "Data2"}
  ), 
  E = Table.Pivot(D, List.Distinct(D[Data1]), "Data1", "Data2", each Number.From(_{0}?)), 
  F = Table.Sort(E, each List.PositionOf(D[Country], [Country]))
in
  F
Power Query solution 2 for Transpose the data as shown, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Pros = Table.Group(
    Source, 
    "Data2", 
    {
      "A", 
      each 
        let
          a = _, 
          b = Table.TransformColumns(a, {}, each try Text.Split(_, ", ") otherwise {_}), 
          c = Table.AddColumn(b, "B", each Table.FromColumns(Record.ToList(_)))[B]
        in
          c
    }, 
    0, 
    (x, y) => Number.From(y = null)
  )[A], 
  Sol = Table.Combine(
    List.Transform(
      Pros, 
      each 
        let
          a = Table.Transpose(Table.Combine(_)), 
          b = Table.FillDown(a, {"Column1"}), 
          c = Table.PromoteHeaders(b), 
          d = Table.RenameColumns(c, {Table.ColumnNames(c){0}, "Country"})
        in
          d
    )
  )
in
  Sol
Power Query solution 3 for Transpose the data as shown, proposed by Luan Rodrigues:
let
  Fonte = Table.FromRecords(
    Table.TransformRows(
      Tabela1, 
      each _
        & [
          Country = if [Data2] = null then "Country" else [Data1], 
          Data2   = if [Data2] = null then [Data1] else [Data2]
        ]
    )
  )[[Country], [Data2]], 
  fx = (x) =>
    let
      add = Table.AddColumn(
        x, 
        "tab", 
        each List.Zip(List.Transform(Record.FieldValues(_), (y) => Text.Split(Text.From(y), ", ")))
      )[tab], 
      cmb = Table.FromColumns(List.Combine(add)), 
      pmv = Table.PromoteHeaders(cmb)
    in
      pmv, 
  grp = Table.Group(
    Fonte, 
    "Country", 
    {{"tabela", each fx(_)}}, 
    0, 
    (a, b) => Number.From(b = "Country")
  )[tabela], 
  cmb = Table.Combine(grp)
in
  cmb
Power Query solution 4 for Transpose the data as shown, proposed by Hussein SATOUR:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  ChangeType = Table.TransformColumnTypes(Source, {{"Data2", type text}, {"Data1", type text}}), 
  AddeCountry = Table.SelectRows(
    Table.FillDown(
      Table.AddColumn(ChangeType, "Cou", each if [Data2] is null then [Data1] else null), 
      {"Cou"}
    ), 
    each ([Data2] <> null)
  ), 
  AddData = Table.AddColumn(
    AddeCountry, 
    "Custom", 
    each List.Zip({Text.Split([Data1], ", "), Text.Split([Data2], ", ")})
  ), 
  SplitData = Table.SplitColumn(
    Table.TransformColumns(
      Table.ExpandListColumn(AddData, "Custom"), 
      {"Custom", each Text.Combine(_, ",")}
    ), 
    "Custom", 
    Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), 
    {"1", "2"}
  ), 
  PivotCols = Table.Pivot(
    Table.RemoveColumns(SplitData, {"Data1", "Data2"}), 
    List.Distinct(SplitData[#"1"]), 
    "1", 
    "2"
  )
in
  PivotCols
Power Query solution 5 for Transpose the data as shown, proposed by An Nguyen:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  T = List.Combine(List.Transform(S[Data1], each try Text.Split(_, ", ") otherwise _)), 
  C = List.Accumulate(
    T, 
    {}, 
    (s, c) => s & {if Text.Start(c, 1) = Text.Lower(Text.Start(c, 1)) then List.Last(s) else c}
  ), 
  N = List.Combine(
    List.Transform(
      S[Data2], 
      each try
        List.Transform(Text.Split(_, ", "), (x) => Number.FromText(x))
      otherwise
        {Replacer.ReplaceValue(_, null, "")}
    )
  ), 
  F = List.Select(List.Zip({C, T, N}), each _{2} <> ""), 
  R = Table.FromRows(F, {"Country", "C2", "C3"})
in
  Table.Sort(
    Table.Pivot(R, List.Distinct(R[C2]), "C2", "C3"), 
    each List.PositionOf(R[Country], [Country])
  )
Power Query solution 6 for Transpose the data as shown, proposed by Ramiro Ayala Chávez:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  a = Table.TransformColumnTypes(S, {{"Data1", type text}, {"Data2", type text}}), 
  b = Table.AddColumn(a, "Country", each if [Data2] = null then [Data1] else null), 
  c = Table.SelectRows(Table.FillDown(b, {"Country"}), each [Data2] <> null), 
  d = Table.TransformColumns(
    c, 
    {{"Data1", each Text.Split(_, ", ")}, {"Data2", each Text.Split(_, ", ")}}
  ), 
  e = Table.AddColumn(d, "Z", each List.Zip({[Data1], [Data2]}))[[Country], [Z]], 
  f = Table.TransformColumns(Table.ExpandListColumn(e, "Z"), {"Z", each Table.FromRows({_})}), 
  g = Table.ExpandTableColumn(f, "Z", {"Column1", "Column2"}), 
  h = Table.Pivot(g, List.Distinct(g[Column1]), "Column1", "Column2"), 
  Sol = Table.Sort(h, {each List.PositionOf(List.Distinct(g[Country]), [Country])})
in
  Sol
Power Query solution 7 for Transpose the data as shown, proposed by Eric Laforce:
let
  fxGroup = (t) =>
    let
      _T = Table.TransformColumns(Table.Skip(t), {}, each Text.Split(Text.From(_), ", "))
    in
      Table.FromRows(
        {{t[Data1]{0}} & List.Combine(_T[Data2])}, 
        {"Country"} & List.Combine(_T[Data1])
      ), 
  Source = Excel.CurrentWorkbook(){[Name = "tData277"]}[Content], 
  Group = Table.Group(
    Source, 
    {"Data2"}, 
    {"G", each fxGroup(_)}, 
    GroupKind.Local, 
    (x, y) => Byte.From(y[Data2] = null)
  ), 
  Combine = Table.Combine(Group[G])
in
  Combine
Power Query solution 8 for Transpose the data as shown, proposed by Seokho MOON:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Recs = List.Accumulate(Table.ToRows(Source), {}, Fun), 
  Fun = (a, v) =>
    [
      A = if v{1} = null then a & {[Country = v{0}]} else List.RemoveLastN(a) & {B}, 
      B = List.Last(a)
        & Record.FromList(try Text.Split(v{1}, ", ") otherwise {v{1}}, Text.Split(v{0}, ", "))
    ][A], 
  Res = Table.Combine(List.Transform(Recs, each Table.FromRecords({_})))
in
  Res
Power Query solution 9 for Transpose the data as shown, proposed by Antriksh Sharma:
let
  Source = Table, 
  A = Table.TransformColumns(Source, {}, each Text.Split(_, ", ")), 
  B = Table.TransformColumnTypes(
    Table.Combine(
      Table.CombineColumns(
        A, 
        Table.ColumnNames(A), 
        each Table.FromColumns(_, Table.ColumnNames(Source)), 
        "x"
      )[x]
    ), 
    {"Data2", Int64.Type}
  ), 
  C = Table.Group(
    B, 
    {"Data1", "Data2"}, 
    {
      "T", 
      each 
        let
          a = _, 
          b = Table.Skip(_), 
          c = Table.PromoteHeaders(
            Table.Transpose(Table.FromRows({{"Country", [Data1]{0}}} & Table.ToRows(b)))
          )
        in
          c
    }, 
    GroupKind.Local, 
    (x, y) => Byte.From(y[Data2] is null)
  ), 
  T = Table.Combine(C[T])
in
  T
Power Query solution 10 for Transpose the data as shown, proposed by Rafael González B.:
let
 Source = Question_Table,
 Fx_Tab = (tbl as table) =>
 let
 N = tbl{0}[Data1],
 V = 
 let
 T = Table.Skip(tbl),
 AC = Table.AddColumn(T, "Union", 
 each List.Combine({Text.Split([Data1] & ", " & Text.From([Data2]), ", ")}))
 in 
 AC[Union],
 U = List.Transform(List.Combine(V), each try Number.From(_) otherwise _),
 C1 = List.Select(U, each _ is text ),
 C2 = List.Select(U, each _ is number ),
 C0 = List.Repeat({N}, List.Count(C1)),
 TFC = Table.FromColumns({C0, C1, C2}, {"Country", "C1", "C2"}),
 Pivoted = Table.Pivot(TFC, List.Distinct(TFC[C1]), "C1", "C2", List.Sum)
 in
 Pivoted,

 Group = Table.Group(Source, "Data2", {{"All", each Fx_Tab(_)}},0, (x,y) => Number.From(y is null)),
 Result = Table.Combine(Group[All])
in
 Result

🧙‍♂️ 🧙‍♂️ 


                    
                  
          
Power Query solution 11 for Transpose the data as shown, proposed by Peter Krkos:
let
  Transformed = Table.Combine(
    Table.AddColumn(
      Table.AddIndexColumn(
        Table.Group(
          Source, 
          "Data2", 
          {
            "T", 
            (r) =>
              Table.FromRows(
                List.TransformMany(
                  Table.ToRows(Table.Skip(r)), 
                  each List.Zip(
                    List.Transform(
                      _, 
                      (x) => List.Transform(try Text.Split(x, ", ") otherwise {x}, Value.FromText)
                    )
                  ), 
                  (x, y) => {r{0}[Data1]} & y
                ), 
                type table [Country = text, A = text, B = Int64.Type]
              )
          }, 
          0, 
          (x, y) => Byte.From(y = null)
        ), 
        "i"
      ), 
      "T2", 
      (w) => Table.AddColumn(w[T], "i", (z) => w[i])
    )[T2]
  ), 
  Pivoted = Table.RemoveColumns(
    Table.Sort(Table.Pivot(Transformed, List.Distinct(Transformed[A]), "A", "B"), "i"), 
    "i"
  )
in
  Pivoted
Power Query solution 12 for Transpose the data as shown, proposed by CA Raghunath Gundi:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Country = Table.FillDown(
    Table.AddColumn(Source, "Country", each if [Data2] = null then [Data1] else null), 
    {"Country"}
  ), 
  NoNull = Table.SelectRows(Country, each ([Data2] <> null)), 
  TextSplit = Table.TransformColumns(
    NoNull, 
    {{"Data1", each Text.Split(_, ", ")}, {"Data2", each Text.Split(Text.From(_), ", ")}}
  ), 
  Table = Table.AddColumn(TextSplit, "Custom", each Table.FromColumns({[Data1], [Data2]}))[
    [Country], 
    [Custom]
  ], 
  Expand = Table.ExpandTableColumn(Table, "Custom", {"Column1", "Column2"}, {"Label", "Value"}), 
  Pivot = Table.Pivot(Expand, List.Distinct(Expand[Label]), "Label", "Value"), 
  Custom1 = Table.Sort(Pivot, each List.PositionOf(Country[Country], [Country]))
in
  Custom1
Power Query solution 13 for Transpose the data as shown, proposed by Alexandre Garcia:
[
H = List.Zip,
P = Table.TransformColumns(Table.Skip(x), {}, each Text.Split(Text.From(_),", ")),
L = {{"Country", Table.FirstValue(x)}} & List.Combine(Table.ToList(P, each H(_))),
C = ((x)=> Table.FromRows({x{1}},x{0})) (H(L))
] 
[C]}, 0, (x,y)=> Byte.From(y = null)) [x])
                    
                  
Power Query solution 14 for Transpose the data as shown, proposed by Maciej Kopczyński:
let
  source = Excel.CurrentWorkbook(){[Name = "tblStart"]}[Content], 
  A = Table.AddColumn(source, "Country", each if [Data2] = null then [Data1] else null), 
  B = Table.FillDown(A, {"Country"}), 
  C = Table.SelectRows(B, each [Data2] <> null), 
  D = Table.AddColumn(
    C, 
    "Helper", 
    each Table.FromRecords(
      List.Transform(
        List.Zip({Text.Split([Data1], ", "), Text.Split(Text.From([Data2]), ", ")}), 
        each Record.FromList(_, {"Letter", "Value"})
      )
    )
  ), 
  E = Table.ExpandTableColumn(D, "Helper", {"Letter", "Value"})[[Country], [Letter], [Value]], 
  tblSort = Table.AddIndexColumn(
    Table.FromList(List.Distinct(E[Country]), Splitter.SplitByNothing(), {"Country"}), 
    "SortOrder", 
    1, 
    1
  ), 
  F = Table.Pivot(E, List.Distinct(E[Letter]), "Letter", "Value"), 
  G = Table.Join(F, "Country", tblSort, "Country"), 
  H = Table.Sort(G, {{"SortOrder", Order.Ascending}}), 
  I = Table.RemoveColumns(H, {"SortOrder"})
in
  I
Power Query solution 15 for Transpose the data as shown, proposed by Fredson Alves Pinho:
let
  Fonte = Excel.CurrentWorkbook(){[Name = "Tabela1"]}[Content], 
  zip = Table.AddColumn(
    Fonte, 
    "zip", 
    each 
      if [Data2] = null then
        Table.FromRecords({[Country = [Data1]]})
      else
        Table.Transpose(
          Table.FromList({[Data1], [Data2]}, each Text.Split(Text.From(_), ", ")), 
          {"A", "B"}
        )
  )[[zip]], 
  tbl = Table.FillDown(Table.ExpandTableColumn(zip, "zip", {"Country", "A", "B"}), {"Country"}), 
  pvt = Table.Pivot(tbl, List.Distinct(Table.SelectRows(tbl, each ([A] <> null))[A]), "A", "B")
in
  pvt
Power Query solution 16 for Transpose the data as shown, proposed by Aleksandar Kovacevic:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Grp = Table.Group(
    Source, 
    "Data1", 
    {
      "B", 
      (x) =>
        Table.FromColumns(
          {List.Union(List.Transform(List.Skip(x[Data1]), each Text.Split(_, ", ")))}
            & {List.Union(List.Transform(List.Skip(x[Data2]), each Text.Split(Text.From(_), ", ")))}, 
          {"P", "V"}
        )
    }, 
    0, 
    (x, y) => Byte.From(List.Contains({"A" .. "Z"}, Text.Start(y, 1)))
  ), 
  Exp = Table.ExpandTableColumn(Grp, "B", {"P", "V"}), 
  Res = Table.RenameColumns(
    Table.Sort(
      Table.Pivot(Exp, List.Distinct(Exp[P]), "P", "V"), 
      each List.PositionOf(Grp[Data1], [Data1])
    ), 
    {"Data1", "Country"}
  )
in
  Res
Power Query solution 17 for Transpose the data as shown, proposed by Aleksandar Kovacevic:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Grp = Table.Group(
    Source, 
    "Data1", 
    {
      "A", 
      each [
        a = _[Data1], 
        b = _[Data2], 
        c = _[Data1]{0}, 
        d = each List.Combine(List.Transform(List.Skip(_), each Text.Split(Text.From(_), ", "))), 
        f = Table.FromRows({{c} & d(b)}, {"Country"} & d(a))
      ][f]
    }, 
    0, 
    (x, y) => Byte.From(List.Contains({"A" .. "Z"}, Text.Start(y, 1)))
  ), 
  Res = Table.Combine(Grp[A])
in
  Res

Solving the challenge of Transpose the data as shown with Excel

Excel solution 1 for Transpose the data as shown, proposed by Bo Rydobon 🇹🇭:
=LET(
    a,
    A2:A10,
    b,
    B2:B10,
    L,
    LAMBDA(
        x,
        TEXTSPLIT(
            ARRAYTOTEXT(
                x
            ),
            ,
            ", "
        )
    ),
    d,
    L(
        b
    ),
    HSTACK(
        VSTACK(
            "Country",
            FILTER(
                a,
                b=0
            )
        ),
        DROP(
            PIVOTBY(
                SCAN(
                    0,
                    d="",
                    SUM
                ),
                L(
                    a
                ),
                --d,
                SUM,
                ,
                0,
                ,
                0,
                ,
                d>""
            ),
            ,
            1
        )
    )
)
_x000D_
Excel solution 2 for Transpose the data as shown, proposed by 🇰🇷 Taeyong Shin:
=LET(
    d,
    B2:B10,
    L,
    LAMBDA(
        x,
        HSTACK(
            XMATCH(
                x,
                x
            ),
            x
        )
    ),
    g,
    GROUPBY(
        L(
            SCAN(
                ,
                IFS(
                    d="",
                    A2:A10
                ),
                LAMBDA(
                    a,
                    v,
                    IFNA(
                        v,
                        a
                    )
                )
            )
        ),
        A2:B10,
        ARRAYTOTEXT,
        ,
        0,
        ,
        d>0
    ),
    F,
    LAMBDA(
        x,
        TEXTSPLIT(
            ARRAYTOTEXT(
                x
            ),
            ,
            ", "
        )
    ),
    n,
    TAKE(
        g,
        ,
        -1
    ),
    DROP(
        PIVOTBY(
            L(
                F(
                    REGEXREPLACE(
                        n,
                        "d+",
                        INDEX(
                            g,
                            ,
                            2
                        )
                    )
                )
            ),
            F(
                INDEX(
                    g,
                    ,
                    3
                )
            ),
            --F(
                n
            ),
            SUM,
            ,
            0,
            ,
            0
        ),
        ,
        1
    )
)
_x000D_ _x000D_
Excel solution 3 for Transpose the data as shown, proposed by Duy Tùng:
=LET(
    f,
    LAMBDA(
        v,
        TEXTSPLIT(
            ARRAYTOTEXT(
                v
            ),
            ,
            ", "
        )
    ),
    a,
    f(
        A2:A10
    ),
    b,
    f(
        B2:B10
    ),
    c,
    SCAN(
        ,
        a,
        LAMBDA(
            x,
            y,
            IF(
                LEN(
                    y
                )>1,
                y,
                x
            )
        )
    ),
    d,
    DROP(
        PIVOTBY(
            HSTACK(
                XMATCH(
                    c,
                    c
                ),
                c
            ),
            a,
            --b,
            SUM,
            ,
            0,
            ,
            0,
            ,
            b>""
        ),
        ,
        1
    ),
    IF(
        TAKE(
            d,
            1
        )&TAKE(
            d,
            ,
            1
        )="",
        "Country",
        d
    )
)
#2: =LET(
    H,
    HSTACK,
    f,
    LAMBDA(
        v,
        TEXTSPLIT(
            ARRAYTOTEXT(
                v
            ),
            ,
            ", "
        )
    ),
    a,
    f(
        A2:A10
    ),
    b,
    f(
        B2:B10
    ),
    c,
    SCAN(
        ,
        a,
        LAMBDA(
            x,
            y,
            IF(
                LEN(
                    y
                )>1,
                y,
                x
            )
        )
    ),
    d,
    TOROW(
        UNIQUE(
            FILTER(
                a,
                LEN(
                    a
                )=1
            )
        )
    ),
    REDUCE(
        H(
            "Country",
            d
        ),
        UNIQUE(
            c
        ),
        LAMBDA(
            x,
            y,
            LET(
                a,
                FILTER(
                    H(
                        a,
                        b
                    ),
                    c=y
                ),
                IFNA(
                    VSTACK(
                        x,
                        H(
                            y,
                            --VLOOKUP(
                                d,
                                a,
                                2,
                                
                            )
                        )
                    ),
                    ""
                )
            )
        )
    )
)
#3: =LET(
    R,
    ARRAYTOTEXT,
    a,
    A2:A10,
    b,
    B2:B10,
    c,
    UNIQUE(
        TEXTSPLIT(
            R(
                FILTER(
                    a,
                    b>0
                )
            ),
            ", "
        ),
        1
    ),
    d,
    SCAN(
        0,
        b,
        LAMBDA(
            x,
            y,
            IF(
                y=0,
                @+A10:y,
                x
            )
        )
    ),
    REDUCE(
        HSTACK(
            "Country",
            E1:H1
        ),
        UNIQUE(
            d
        ),
        LAMBDA(
            x,
            y,
            IFNA(
                VSTACK(
                    x,
                    HSTACK(
                        y,
                        --HLOOKUP(
                            E1:H1,
                            TEXTSPLIT(
                                TEXTJOIN(
                                    "/",
                                    ,
                                    BYCOL(
                                        FILTER(
                                            a:b,
                                            d=y
                                        ),
                                        R
                                    )
                                ),
                                ", ",
                                "/"
                            ),
                            2,
                            
                        )
                    )
                ),
                ""
            )
        )
    )
)
_x000D_ _x000D_
Excel solution 4 for Transpose the data as shown, proposed by Sunny Baggu:
=LET(
    
     _c,
     B2:B10 = "",
    
     _a,
     SCAN(
         "",
          IF(
              _c,
               A2:A10,
               ""
          ),
          LAMBDA(
              a,
               v,
               IF(
                   v = "",
                    a,
                    v
               )
          )
     ),
    
     _b,
     FILTER(
         _a,
          1 - _c
     ),
    
     _d,
     FILTER(
         A2:A10,
          1 - _c
     ),
    
     _e,
     FILTER(
         B2:B10,
          1 - _c
     ),
    
     _u,
     FILTER(
         A2:A10,
          _c
     ),
    
     _h,
     UNIQUE(
         TEXTSPLIT(
             ARRAYTOTEXT(
                 _d
             ),
              ", "
         ),
          1
     ),
    
     _v,
     REDUCE(
         
          HSTACK(
              "Country",
               _h
          ),
         
          _u,
         
          LAMBDA(
              x,
               y,
              
               VSTACK(
                   
                    x,
                   
                    LET(
                        
                         _d1,
                         TEXTSPLIT(
                             ARRAYTOTEXT(
                                 FILTER(
                                     _d,
                                      _b = y
                                 )
                             ),
                              ,
                              ", "
                         ),
                        
                         _e1,
                         1 * TEXTSPLIT(
                             ARRAYTOTEXT(
                                 FILTER(
                                     _e,
                                      _b = y
                                 )
                             ),
                              ,
                              ", "
                         ),
                        
                         HSTACK(
                             y,
                              XLOOKUP(
                                  _h,
                                   _d1,
                                   _e1,
                                   ""
                              )
                         )
                         
                    )
                    
               )
               
          )
          
     ),
    
     _v
    
)
_x000D_ _x000D_
Excel solution 5 for Transpose the data as shown, proposed by LEONARD OCHEA 🇷🇴:
=LET(
    a,
    A2:A10,
    b,
    B2:B10,
    i,
    INDEX,
    F,
    LAMBDA(
        x,
        y,
        i(
            TEXTSPLIT(
                TEXTJOIN(
                    ", ",
                    ,
                    IF(
                        b="",
                        x&"|",
                        y
                    )
                ),
                "|",
                ", "
            ),
            ,
            1
        )
    ),
    w,
    F(
        b,
        a
    ),
    p,
    SCAN(
        ,
        IF(
            w="",
            1
        ),
        SUM
    ),
    g,
    DROP(
        PIVOTBY(
            HSTACK(
                p,
                i(
                    F(
                        a,
                        ""
                    ),
                    p
                )
            ),
            w,
            F(
                b,
                b
            ),
            SINGLE,
            ,
            0,
            ,
            0,
            ,
            w>""
        ),
        ,
        1
    ),
    IFERROR(
        --g,
        g
    )
)
_x000D_ _x000D_
Excel solution 6 for Transpose the data as shown, proposed by An Nguyen:
=LET(
    f,
    INDEX,
    n,
    TEXTSPLIT(
        ARRAYTOTEXT(
            B2:B10
        ),
        ,
        ", "
    ),
    t,
    REDUCE(
        ,
        TOCOL(
            A2:A10
        ),
        LAMBDA(
            a,
            v,
            VSTACK(
                a,
                TEXTSPLIT(
                    v,
                    ,
                    ", "
                )
            )
        )
    ),
    d,
    HSTACK(
        SCAN(
            ,
            t,
            LAMBDA(
                a,
                v,
                IF(
                    REGEXTEST(
                        v,
                        "^[a-z]"
                    ),
                    TAKE(
                        a,
                        -1
                    ),
                    v
                )
            )
        ),
        t,
        n
    ),
    c,
    FILTER(
        d,
        TAKE(
            d,
            ,
            -1
        )<>""
    ),
    SORTBY(
        PIVOTBY(
            f(
                c,
                ,
                1
            ),
            f(
                c,
                ,
                2
            ),
            f(
                c,
                ,
                3
            ),
            SINGLE,
            ,
            0,
            ,
            0
        ),
        VSTACK(
            "",
            UNIQUE(
                f(
                c,
                ,
                1
            )
            )
        )
    )
)
_x000D_ _x000D_
Excel solution 7 for Transpose the data as shown, proposed by Md. Zohurul Islam:
=LET(
    u,
    A2:A10,
    v,
    B2:B10,
    
    w,
    UNIQUE(
        SCAN(
            ,
            IF(
                v="",
                u,
                ""
            ),
            LAMBDA(
                x,
                y,
                IF(
                    y="",
                    x,
                    y
                )
            )
        )
    ),
    
    z,
    BYROW(
        FILTER(
            HSTACK(
                u,
                v
            ),
            v<>""
        ),
        ARRAYTOTEXT
    ),
    
    g,
    IFNA(
        DROP(
            REDUCE(
                "",
                z,
                LAMBDA(
                    x,
                    y,
                    LET(
                        a,
                        TEXTSPLIT(
                            y,
                            ", "
                        ),
                        b,
                        WRAPCOLS(
                            a,
                            COUNTA(
                                a
                            )/2
                        ),
                        d,
                        VSTACK(
                            x,
                            b
                        ),
                        d
                    )
                )
            ),
            1
        ),
        ""
    ),
    
    h,
    IFERROR(
        --g,
        g
    ),
    
    i,
    TOCOL(
        IFNA(
            w,
            SEQUENCE(
                ,
                ROWS(
                    h
                )/ROWS(
                    w
                )
            )
        )
    ),
    
    j,
    PIVOTBY(
        i,
        TAKE(
            h,
            ,
            1
        ),
        DROP(
            h,
            ,
            1
        ),
        SUM,
        0,
        0,
        ,
        0
    ),
    
    j
)
_x000D_ _x000D_
Excel solution 8 for Transpose the data as shown, proposed by Pieter de B.:
=LET(
    a,
    A2:A10,
    b,
    B2:B10,
    L,
    LAMBDA(
        x,
        TEXTSPLIT(
            TEXTAFTER(
                ", "&x,
                ", ",
                SEQUENCE(
                    ,
                    84
                )
            ),
            ", "
        )
    ),
    y,
    --L(
        b
    ),
    Z,
    LAMBDA(
        x,
        TOCOL(
            IFS(
                y,
                x
            ),
            2
        )
    ),
    p,
    PIVOTBY(
        Z(
            SCAN(
                "",
                a,
                LAMBDA(
                    x,
                    y,
                    IF(
                        CODE(
                            y
                        )<97,
                        y,
                        x
                    )
                )
            )
        ),
        Z(
            L(
                a
            )
        ),
        Z(
                            y
                        ),
        SUM,
        ,
        0,
        ,
        0
    ),
    q,
    IF(
        SCAN(
            ,
            p,
            CONCAT
        )="",
        "Country",
        p
    ),
    SORTBY(
        q,
        XMATCH(
            TAKE(
                p,
                ,
                1
            ),
            VSTACK(
                ,
                a
            )
        )
    )
)
_x000D_ _x000D_
Excel solution 9 for Transpose the data as shown, proposed by Asheesh Pahwa:
=LET(
    s,
    SCAN(
        "",
        B2:B10,
        LAMBDA(
            x,
            y,
            IF(
                y="",
                OFFSET(
                    y,
                    0,
                    -1
                ),
                x
            )
        )
    ),
    u,
    UNIQUE(
        s
    ),
    d,
    DROP(
        REDUCE(
            "",
            u,
            LAMBDA(
                x,
                y,
                VSTACK(
                    x,
                    LET(
                        f,
                        FILTER(
                            A2:B10,
                            s=y
                        ),
                        d,
                        DROP(
                            f,
                            1
                        ),
                        t,
                        TEXTSPLIT(
                            ARRAYTOTEXT(
                                d
                            ),
                            ,
                            ", "
                        ),
                        txt,
                        FILTER(
                            t,
                            ISERROR(
                                --t
                            )
                        ),
                        IFNA(
                            HSTACK(
                                y&txt,
                                TOCOL(
                                    --t,
                                    3
                                )
                            ),
                            y
                        )
                    )
                )
            )
        ),
        1
    ),
    i,
    INDEX(
        d,
        ,
        1
    ),
    
    e,
    TOROW(
        UNIQUE(
            RIGHT(
                i
            )
        )
    ),
    c,
    u&e,
    h,
    HSTACK(
        D1,
        e
    ),
    VSTACK(
        h,
        HSTACK(
            u,
            XLOOKUP(
                c,
                i,
                TAKE(
                    d,
                    ,
                    -1
                ),
                ""
            )
        )
    )
)
_x000D_ _x000D_
Excel solution 10 for Transpose the data as shown, proposed by LUIS FLORENTINO COUTO CORTEGOSO:
=LET(
    f,
    LAMBDA(
        d,
        DROP(
            REDUCE(
                "",
                d,
                LAMBDA(
                    a,
                    x,
                    VSTACK(
                        a,
                        IFERROR(
                            TEXTSPLIT(
                                x,
                                ,
                                ", "
                            ),
                            ""
                        )
                    )
                )
            ),
            1
        )
    ),
    r,
    f(
        A2:A10
    ),
    d,
    f(
        B2:B10
    ),
    c,
    LET(
        l,
        IF(
            d="",
            r
        ),
        d,
         SCAN(
             0,
             l,
             LAMBDA(
                 a,
                 x,
                 IF(
                     x<>FALSE,
                     x,
                     a
  &               )
             )
         ),
        d
    ),
    t,
    VSTACK(
        HSTACK(
            "country",
            TOROW(
                UNIQUE(
                    FILTER(
                        r,
                        LEN(
                            r
                        )=1
                    )
                )
            )
        ),
        SORTBY(
            DROP(
                PIVOTBY(
                    c,
                    r,
                    d,
                    CONCAT,
                    0,
                    0,
                    ,
                    0,
                    ,
                    d<>""
                ),
                1
            ),
            UNIQUE(
                c
            )
        )
    ),
    IFERROR(
        VALUE(
            t
        ),
        t
    )
)
_x000D_ _x000D_
Excel solution 11 for Transpose the data as shown, proposed by Fredson Alves Pinho:
=LET(
    
     c³,
    --TEXTSPLIT(
        TEXTJOIN(
            ", ",
            0,
            B2:B10
        ),
        ,
        ", "
    ),
    
     c²,
    TEXTSPLIT(
        TEXTJOIN(
            ", ",
            0,
            A2:A10
        ),
        ,
        ", "
    ),
    
     c¹,
    SCAN(
        "a",
        IF(
            ISNUMBER(
                c³
            ),
            c³,
            c²
        ),
        LAMBDA(
            a,
            v,
            IF(
                ISNUMBER(
                    v
                ),
                a,
                v
            )
        )
    ),
    
     PIVOTBY(
         c¹,
         c²,
         c³,
         SUM,
         ,
         0,
         ,
         0,
         ,
         ISNUMBER(
                c³
            )
     )
)
_x000D_ _x000D_
Excel solution 12 for Transpose the data as shown, proposed by red craven:
=LET(
    a,
    A2:A10,
    b,
    B2:B10,
    F,
    LAMBDA(
        x,
        TEXTSPLIT(
            ARRAYTOTEXT(
                FILTER(
                    x,
                    b>0
                )
            ),
            ,
            ", "
        )
    ),
    c,
    TOCOL(
        IF(
            WRAPROWS(
                F(
                    a
                ),
                3
            )>0,
            FILTER(
                a,
                b=0
            )
        )
    ),
    p,
    DROP(
        PIVOTBY(
            HSTACK(
                XMATCH(
                    c,
                    c
                ),
                c
            ),
            F(
                    a
                ),
            --F(
                b
            ),
            SUM,
            ,
            0,
            ,
            0
        ),
        ,
        1
    ),
    IF(
        TAKE(
            p,
            ,
            1
        )&p="",
        "Country",
        p
    )
)
=LET(
    F,
    LAMBDA(
        x,
        TEXTSPLIT(
            ARRAYTOTEXT(
                x
            ),
            ,
            ", "
        )
    ),
    a,
    F(
        A2:A10
    ),
    b,
    F(
        B2:B10
    ),
    s,
    SCAN(
        0,
        b="",
        SUM
    ),
    p,
    DROP(
        PIVOTBY(
            HSTACK(
                s,
                XLOOKUP(
                    s,
                    s,
                    a
                )
            ),
            a,
            --b,
            SUM,
            ,
            0,
            ,
            0,
            ,
            b>""
        ),
        ,
        1
    ),
    IF(
        TAKE(
            p,
            ,
            1
        )&p="",
        "Country",
        p
    )
)
_x000D_ _x000D_
Excel solution 13 for Transpose the data as shown, proposed by Ricardo Romero Garcia:
=LET(
    fx,
    LAMBDA(
        c,
        REDUCE(
            ,
            c,
            LAMBDA(
                a,
                v,
                VSTACK(
                    a,
                    SI(
                        ISNUMBER(
                            SEARCH(
                                ",",
                                v
                            )
                        ),
                        TOCOL(
                            TEXTSPLIT(
                                v,
                                ", "
                            )
                        ),
                        v
                    )
                )
            )
        )
    ),
    b,
    fx(
        A2:A10
    ),
    d,
    SCAN(
        "",
        b,
        LAMBDA(
            a,
            
            v,
            SI(
                LEN(
                    v
                )>1,
                v,
                a
            )
        )
    ),
    e,
    --fx(
        B2:B10
    ),
    DROP(
        PIVOTBY(
            d,
            b,
            e,
            SUM,
            ,
            0,
            2,
            ,
            ,
            e
        ),
        ,
        -1
    )
)
_x000D_ _x000D_
Excel solution 14 for Transpose the data as shown, proposed by Manuel Reyes:
=LET(
    EJE,
    TOCOL(
        TEXTSPLIT(
            TEXTJOIN(
                "/",
                0,
                A2:B10
            ),
            ", ",
            "/"
        ),
        3
    ),
    CONSE,
    SCAN(
        0,
        EJE,
        LAMBDA(
            a,
            v,
            IF(
                LEN(
                    v
                )>4,
                a+1,
                SUM(
                    a
                )
            )
        )
    ),
    CONSO1,
    TOCOL(
        IF(
            ISNUMBER(
                --EJE
            ),
            CONSE,
            nume
        ),
        2
    ),
    CONSE2,
    SCAN(
        "",
        EJE,
        LAMBDA(
            a,
            v,
            IF(
                LEN(
                    v
                )>4,
                v,
                a
            )
        )
    ),
    CONSO2,
    TOCOL(
        IF(
            ISNUMBER(
                --EJE
            ),
            CONSE2,
            nume
        ),
        2
    ),
    CONSO3,
    TOCOL(
        IF(
            CODE(
                EJE
            )>96,
            EJE,
            nume
        ),
        2
    ),
    CONSO4,
    TOCOL(
        IF(
            ISNUMBER(
                --EJE
            ),
            EJE,
            nume
        ),
        2
    ),
    DROP(
        PIVOTBY(
            HSTACK(
                CONSO1,
                CONSO2
            ),
            CONSO3,
            --CONSO4,
            SUM,
            0,
            0,
            ,
            0
        ),
        ,
        1
    )
)
_x000D_

Solving the challenge of Transpose the data as shown with Python

_x000D_
Python solution 1 for Transpose the data as shown, proposed by Luan Rodrigues:
import pandas as pd
import numpy as np
file = r"PQ_Challenge_277.xlsx"
df = pd.read_excel(file,usecols="A:B")
df = df.assign(
 Data1=np.where(df['Data2'].isnull(), 'Country', df['Data1']),
 Data2=np.where(df['Data2'].isnull(), df['Data1'], df['Data2'])
 )[['Data1','Data2']]
df['Country'] = np.where(df['Data1'] == 'Country', df['Data2'], np.nan)
df['Country'] = df['Country'].ffill()
df = df[df['Data1'] != 'Country']
def transform(group):
 val1 = ', '.join(map(str, group['Data1'])).split(', ')
 val2 = ', '.join(map(str, group['Data2'])).split(', ')
 zipped = list(zip(val1, val2))
 df_result = pd.DataFrame(zipped, columns=['Data1', 'Data2'])
 df_result['Country'] = group['Country'].iloc[0] 
 return df_result
df_final = df.groupby('Country').apply(transform).reset_index(drop=True)
df_final = df_final.pivot(index='Country', columns='Data1', values='Data2').reset_index()
df_final = df_final.rename_axis(None, axis=1)
print(df_final)
                    
                  
_x000D_

Solving the challenge of Transpose the data as shown with Python in Excel

_x000D_
Python in Excel solution 1 for Transpose the data as shown, proposed by Alejandro Campos:
df = xl("A1:B10", headers=True).astype(str).fillna('')
d, c = {'Country': [], 'a': [], 'b': [], 'c': [], 'd': []}, None
for _, r in df.iterrows():
 if r['Data1'] in ['Denmark', 'Sweden', 'Germany']:
 c = r['Data1']
 d['Country'].append(c)
 [d[k].append('') for k in ['a', 'b', 'c', 'd']]
 else:
 for k, v in zip(r['Data1'].split(', '), r['Data2'].split(', ')): d[k][-1] = v
transposed_df = pd.DataFrame(d)
                    
                  
_x000D_ _x000D_
Python in Excel solution 2 for Transpose the data as shown, proposed by Francesco Bianchi 🇮🇹:
df = xl("A1:B10", headers=True)
df['Country'] = [x if pd.isna(y) else np.nan for x, y in zip(df['Data1'], df['Data2'])] 
df['Country'] = df['Country'].ffill()
df['a'] = [x if not pd.isna(y) else np.nan for x, y in zip(df['Data1'].shift(-1), df['Country'])]
df['v'] = [x if not pd.isna(y) else np.nan for x, y in zip(df['Data2'].shift(-1), df['Country'])]
df = df.iloc[:,2:].dropna()
df['a'] = df['a'].str.split(', ')
df['v'] = df['v'].astype(str).str.split(', ')
df = df.explode(['a', 'v'], ignore_index=True)
df['v'] = df['v'].astype(float) 
pivot_df = df.pivot(index='Country', columns='a', values='v')
pivot_df.fillna('', inplace=True) 
pivot_df = pivot_df.reset_index(drop=False)
pivot_df.columns.name = None
pivot_df['Country'] = pd.Categorical(pivot_df['Country'], categories=df['Country'].unique(), ordered=True)
pivot_df = pivot_df.sort_values('Country').reset_index(drop=True)
pivot_df
                    
                  
_x000D_

Solving the challenge of Transpose the data as shown with R

_x000D_
R solution 1 for Transpose the data as shown, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "Power Query/PQ_Challenge_277.xlsx"
input = read_excel(path, range = "A1:B10")
test  = read_excel(path, range = "D1:H4")
result = input %>%
 mutate(country = ifelse(is.na(Data2), Data1, NA)) %>%
 fill(country) %>% 
 na.omit() %>%
 separate_rows(c(Data1, Data2)) %>%
 mutate(Data2 = as.numeric(Data2)) %>%
 pivot_wider(names_from = Data1, values_from = Data2) 
all.equal(result, test, check.attributes = FALSE)
#> [1] TRUE
                    
                  
_x000D_

Leave a Reply