Home » Rank Regions by Yearly Scores

Rank Regions by Yearly Scores

Rank regions on the basis of values given for each year and list the regions for maximum occurrences of Rank 1, 2 and 3 in different years. Ex. Region3, Region8, Region14 occurred for rank 1, 3 times which was maximum occurrence of rank 1 in different years Region3 in 2020, 2021 & 2022 Region8 in 2018, 2019 & 2020 Region14 in 2019, 2022 & 2024

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

Solving the challenge of Rank Regions by Yearly Scores with Power Query

_x000D_
Power Query solution 1 for Rank Regions by Yearly Scores, proposed by Bo Rydobon 🇹🇭:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Rank = Table.FromColumns(
    {
      {1, 2, 3}, 
      List.Transform(
        List.Zip(
          List.Transform(
            List.Zip(
              List.Transform(
                List.Skip(Table.ToColumns(Source)), 
                (l) =>
                  List.Transform(l, each List.PositionOf(List.Distinct(List.Sort(l, - 1)), _) + 1)
              )
            ), 
            each List.Transform({1, 2, 3}, (n) => List.Count(List.Select(_, each _ = n)))
          )
        ), 
        (l) =>
          Text.Combine(
            List.Transform(List.PositionOf(l, List.Max(l), 2), (n) => Source[Region]{n}), 
            ", "
          )
      )
    }, 
    {"Rank", "Region"}
  )
in
  Rank
_x000D_ _x000D_
Power Query solution 2 for Rank Regions by Yearly Scores, proposed by John V.:
let
 S = Excel.CurrentWorkbook(){0}[Content],
 G = Table.Group, L = List.Sort, F = Table.SelectRows,
 U = Table.UnpivotOtherColumns(S, {"Region"}, "Y", "V"),
 T = Table.TransformColumnTypes(U,{{"Y", Int64.Type}, {"V", Int64.Type}}),
 P = hashtag#table({"Rank"}, {{1}, {2}, {3}}),
 R = Table.AddColumn(P, "Region", each
 let
 v = _[Rank] - 1,
 H = G(T, "Y", {"A", each 
 let
 a = L(List.Distinct(_[V]), -1){v} 
 in
 F(_, each _[V] = a)[Region]
 })[[A]],
 E = G(Table.ExpandListColumn(H, "A"), "A", {"C", List.Count}),
 a = L(E[C], -1){0}
 in
 Text.Combine(F(E, each [C] = a)[A], ", ")
 )
in
 R

Blessings!


                    
                  
          
_x000D_ _x000D_
Power Query solution 3 for Rank Regions by Yearly Scores, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content], 
  Type = Table.TransformColumns(Source, {"Region", Text.From}, Number.From), 
  Ranks = 3, 
  Region = Type[Region], 
  Years = List.Skip(Table.ToColumns(Type)), 
  Generate = List.Generate(
    () => [a = - 1], 
    each [a] < Ranks, 
    each [
      a = [a] + 1, 
      b = List.Transform(
        Years, 
        (f) =>
          [
            D = List.Distinct(f), 
            S = List.Sort(D, 1), 
            P = List.PositionOf(f, S{a}, Occurrence.All), 
            R = List.Transform(P, (x) => Region{x})
          ][R]
      ), 
      c = List.Combine(b), 
      d = List.Sort(List.Modes(c), (x) => List.PositionOf(Region, x))
    ], 
    each [Rank = [a] + 1, Regions = Text.Combine([d], ", ")]
  ), 
  Return = Table.FromRecords(List.Skip(Generate))
in
  Return
_x000D_ _x000D_
Power Query solution 4 for Rank Regions by Yearly Scores, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Type = Table.TransformColumnTypes(Source, List.Transform(Years, each {_, Int64.Type})), 
  Years = List.Skip(Table.ColumnNames(Source)), 
  Combine = Table.Combine(
    List.Transform(
      Years, 
      each Table.SelectColumns(
        Table.SelectRows(
          Table.AddRankColumn(Type, "Rank", {_, Order.Descending}, [RankKind = RankKind.Dense]), 
          each [Rank] < 4
        ), 
        {"Region", "Rank"}
      )
    )
  ), 
  Group = Table.Group(Combine, {"Region", "Rank"}, {{"A", each List.Count([Rank])}}), 
  Sol = Table.Group(
    Group, 
    {"Rank"}, 
    {
      {
        "Regions", 
        each 
          let
            a = List.Max([A]), 
            b = Text.Combine(Table.SelectRows(_, each [A] = a)[Region], ", ")
          in
            b
      }
    }
  )
in
  Sol
_x000D_ _x000D_
Power Query solution 5 for Rank Regions by Yearly Scores, proposed by Rafael González B.:
let
 Source = Excel.CurrentWorkbook(){0}[Content],
 TG = Table.Group,
 UnPivot = Table.UnpivotOtherColumns(Source, {"Region"}, "Year", "Amount"),
 GroupBy = TG(UnPivot, {"Year"}, {{"Tab", each _}}),
 Transf = Table.TransformColumns(GroupBy, {"Tab", each 
 let
 Rank = Table.AddRankColumn(_, "Rank", {"Amount", Order.Descending},
 [RankKind = RankKind.Dense]),
 FilterRank = Table.SelectRows(Rank, each [Rank] < 4)
 in
 FilterRank
 })[[Tab]],
 Exp = Table.ExpandTableColumn(Transf, "Tab", {"Region", "Rank"}, {"Region", "Rank"}),
 GroupByOc = TG(Exp, {"Rank", "Region"}, {{"Ocurrence", each Table.RowCount(_), Int64.Type}}),
 GroupFinal = TG(GroupByOc, {"Rank"}, {{"Ocurr", each _}}),
 Result = Table.AddColumn(GroupFinal, "Regions", each 
 let 
 a = List.Max([Ocurr][Ocurrence]),
 b = Table.SelectRows([Ocurr], each [Ocurrence] = a),
 c = Table.AddColumn(b, "Reg", each Number.From(Text.Select([Region],{"0".."9"}))),
 d = Table.Sort(c, {"Reg", Order.Ascending})
 in 
 Text.Combine(d[Region], ", "))[[Rank], [Regions]]
in
 Result

🧙🏻‍♂️🧙🏻‍♂️🧙🏻‍♂️


                    
                  
          
_x000D_ _x000D_
Power Query solution 6 for Rank Regions by Yearly Scores, proposed by Arnaud Duvernois:
let
  Source = Excel.CurrentWorkbook(){[Name = "Tableau1"]}[Content], 
  Unpivot = Table.UnpivotOtherColumns(Source, {"Region"}, "Attribut", "Valeur"), 
  GroupBy = Table.Group(
    Unpivot, 
    {"Attribut"}, 
    {
      {
        "Nombre", 
        each 
          let
            a = List.FirstN(List.Sort(List.Distinct(_[Valeur]), Order.Descending), 3)
          in
            Table.AddColumn(_, "Rank", each List.PositionOf(a, [Valeur]) + 1)
      }
    }
  ), 
  SelectRows = Table.SelectRows(Table.Combine(GroupBy[Nombre]), each [Rank] <> 0), 
  Result = Table.Group(
    SelectRows, 
    {"Rank"}, 
    {
      {
        "Region", 
        each 
          let
            a = Table.Group(_, {"Region"}, {{"Number", (s) => Table.RowCount(s)}})
          in
            Text.Combine(Table.SelectRows(a, each [Number] = List.Max(a[Number]))[Region], ", ")
      }
    }
  ), 
  Sort = Table.Sort(Result, {{"Rank", Order.Ascending}})
in
  Sort
_x000D_

Solving the challenge of Rank Regions by Yearly Scores with Excel

_x000D_
Excel solution 1 for Rank Regions by Yearly Scores, proposed by Bo Rydobon 🇹🇭:
=HSTACK(
    {1;2;3},
    MAP(
        {1;2;3},
        LAMBDA(
            n,
            INDEX(
                GROUPBY(
                    BYROW(
                        N(
                            -B2:H20=BYCOL(
                                -B2:H20,
                                LAMBDA(
                                    x,
                                    SMALL(
                                        UNIQUE(
                                            x
                                        ),
                                        n
                                    )
                                )
                            )
                        ),
                        SUM
                    ),
                    A2:A20,
                    ARRAYTOTEXT,
                    ,
                    0,
                    -1
                ),
                1,
                2
            )
        )
    )
)
_x000D_ _x000D_
Excel solution 2 for Rank Regions by Yearly Scores, proposed by John V.:
=HSTACK(
    {1;2;3},
    MAP(
        {1;2;3},
        LAMBDA(
            x,
            LET(
                v,
                --B2:H20,
                f,
                BYROW(
                    N(
                        v=BYCOL(
                            v,
                            LAMBDA(
                                c,
                                LARGE(
                                    UNIQUE(
                                        c
                                    ),
                                    x
                                )
                            )
                        )
                    ),
                    SUM
                ),
                TEXTJOIN(
                    ", ",
                    ,
                    REPT(
                        A2:A20,
                        MAX(
                            f
                        )=f
                    )
                )
            )
        )
    )
)
_x000D_ _x000D_
Excel solution 3 for Rank Regions by Yearly Scores, proposed by محمد حلمي:
=MAP(SEQUENCE(
    3
),
    LAMBDA(v,
     LET(j,
    DROP(
        REDUCE(
            0,
            SEQUENCE(
                7
            ),
            LAMBDA(
                a,
                d,
                LET(
                    
                    x,
                    --CHOOSECOLS(
                        B2:H20,
                        d
                    ),
                    VSTACK(
                        a,
                        FILTER(
                            A2:A20,
                            
                            x=LARGE(
                                UNIQUE(
                                    x
                                ),
                                v
                            )
                        )
                    )
                )
            )
        ),
        1
    ),
    u,
    UNIQUE(
        j
    ),
    k,
    SORTBY(
        u,
        --MID(
            u,
            7,
            9
        )
    ),
    
i,
    MAP(k,
    LAMBDA(a,
    SUM(--(a=j)))),
    TEXTJOIN(
        ", ",
        ,
        REPT(
            k,
            i=MAX(
                i
            )
        )
    ))))
_x000D_ _x000D_
Excel solution 4 for Rank Regions by Yearly Scores, proposed by Kris Jaganah:
=LET(a,
    A2:A20,
    b,
    --B2:H20,
    c,
    B1:H1,
    d,
    TOCOL(
        b&c&a
    ),
    e,
    --MID(
        d,
        1,
        3
    ),
    f,
    --MID(
        d,
        4,
        4
    ),
    g,
    MID(
        d,
        8,
        8
    ),
    h,
    TOROW(
        UNIQUE(
            f
        )
    ),
    i,
    DROP(
        REDUCE(
            "",
            h,
            LAMBDA(
                x,
                y,
                HSTACK(
                    x,
                    TAKE(
                        SORT(
                            UNIQUE(
                                FILTER(
                                    e,
                                    y=f
                                )
                            ),
                            ,
                            -1
                        ),
                        3
                    )
                )
            )
        ),
        ,
        1
    ),
    j,
    TOCOL(
        h&i
    ),
    k,
    INT(
        SEQUENCE(
            ROWS(
                j
            ),
            ,
            ,
            1/COUNT(
                h
            )
        )
    ),
    l,
    XLOOKUP(
        f&e,
        j,
        k,
        0
    ),
    m,
    {1;2;3},
    HSTACK(m,
    MAP(m,
    LAMBDA(z,
    LET(p,
    FILTER(
        g,
        l=z
    ),
    q,
    UNIQUE(
        p
    ),
    r,
    MAP(q,
    LAMBDA(zz,
    SUM(--(p=zz)))),
    ARRAYTOTEXT(
        FILTER(
            q,
            r=MAX(
                r
            )
        )
    ))))))
_x000D_ _x000D_
Excel solution 5 for Rank Regions by Yearly Scores, proposed by Julian Poeltl:
=LET(T,
    A1:H20,
    TT,
    DROP(
        T,
        1,
        1
    )*1,
    R,
    DROP(
        TAKE(
            T,
            ,
            1
        ),
        1
    ),
    RN,
    LAMBDA(
        R,
        BYCOL(
            TT,
            LAMBDA(
                A,
                CHOOSEROWS(
                    UNIQUE(
                        SORT(
                            A,
                            ,
                            -1
                        )
                    ),
                    R
                )
            )
        )
    ),
    AT,
    {1,
    2,
    3},
    Re,
    MAP(AT,
    LAMBDA(C,
    TEXTJOIN(", ",
    ,
    FILTER(R,
    LET(B,
    BYROW(--(TT=RN(
        C
    )),
    LAMBDA(
        A,
        SUM(
            A
        )
    )),
    B=MAX(
        B
    )))))),
    HSTACK(
        VSTACK(
            "Rank",
            AT
        ),
        VSTACK(
            "Regions",
            Re
        )
    ))
_x000D_ _x000D_
Excel solution 6 for Rank Regions by Yearly Scores, proposed by Timothée BLIOT:
=LET(H,
    HSTACK,
    R,
    REDUCE,
    I,
    INDEX,
    T,
    B2:H20,
    D,
    DROP(R("",
    SEQUENCE(
        COLUMNS(
            T
        )
    ),
    LAMBDA(a,
    v,
    H(a,
    MAP(I(
        T,
        ,
        v
    ),
    LAMBDA(x,
    1+SUM(--(x
_x000D_ _x000D_
Excel solution 7 for Rank Regions by Yearly Scores, proposed by Oscar Mendez Roca Farell:
=LET(
    r,
     {1;2;3},
     HSTACK(
         r,
          MAP(
              r,
               LAMBDA(
                   a,
                    TEXTJOIN(
                        ", ",
                         ,
                         "Region"&MODE.MULT(
                             --TEXTSPLIT(
                                 CONCAT(
                                     BYCOL(
                                         B2:H20,
                                          LAMBDA(
                                              c,
                                               TEXTJOIN(
                                                   ", ",
                                                    ,
                                                    REPT(
                                                        MID(
                                                            A2:A20,
                                                             7,
                                                             3
                                                        ),
                                                         c=LARGE(
                                                             UNIQUE(
                                                                 c
                                                             ),
                                                              a
                                                         )
                                                    )
                                               )
                                          )
                                     )&", "
                                 ),
                          &        ,
                                  ", ",
                                  1
                             )
                         )
                    )
               )
          )
     )
)
_x000D_ _x000D_
Excel solution 8 for Rank Regions by Yearly Scores, proposed by Duy Tùng:
=LET(
    a,
    {1;2;3},
    b,
    B2:H20,
    HSTACK(
        a,
        MAP(
            a,
            LAMBDA(
                v,
                @DROP(
                    GROUPBY(
                        BYROW(
                            N(
                                b=BYCOL(
                                    b,
                                    LAMBDA(
                                        x,
                                        LARGE(
                                            UNIQUE(
                                                x
                                            ),
                                            v
                                        )
                                    )
                                )
                            ),
                            SUM
                        ),
                        A2:A20,
                        ARRAYTOTEXT,
                        ,
                        ,
                        -1
                    ),
                    ,
                    1
                )
            )
        )
    )
)
_x000D_ _x000D_
Excel solution 9 for Rank Regions by Yearly Scores, proposed by Sunny Baggu:
=LET(
    
     _v,
     DROP(
         
          REDUCE(
              
               "",
              
               SEQUENCE(
                   COLUMNS(
                       B1:H1
                   )
               ),
              
               LAMBDA(
                   a,
                    v,
                    HSTACK(
                        a,
                         XMATCH(
                             INDEX(
                                 B2:H20,
                                  ,
                                  v
                             ),
                              UNIQUE(
                                  SORT(
                                      INDEX(
                                 B2:H20,
                                  ,
                                  v
                             ),
                                       ,
                                       -1
                                  )
                              )
                         )
                    )
               )
               
          ),
         
          ,
         
          1
          
     ),
    
     _s,
     SEQUENCE(
         3
     ),
    
     HSTACK(
         
          _s,
         
          MAP(
              _s,
               LAMBDA(
                   x,
                    ARRAYTOTEXT(
                        LET(
                            _r,
                             BYROW(
                                 N(
                                     _v = x
                                 ),
                                  LAMBDA(
                                      a,
                                       SUM(
                                           a
                                       )
                                  )
                             ),
                             FILTER(
                                 A2:A20,
                                  _r = MAX(
                                      _r
                                  )
                             )
                        )
                    )
               )
          )
          
     )
    
)
_x000D_ _x000D_
Excel solution 10 for Rank Regions by Yearly Scores, proposed by Asheesh Pahwa:
=LET(n,
    B2:H20,
    d,
    DROP(REDUCE("",
    SEQUENCE (COLUMNS(
        n
    )),
    LAMBDA(
        a,
        v,
        HSTACK(
            a,
            LET(
                I,
                INDEX(
                    n,
                    ,
                    v
                ),
                u,
                UNIQUE(
                    I
                ),
                L,
                LARGE(
                    u,
                    SEQUENCE(
                        3
                    )
                ),
                m,
                
                XMATCH(
                    I,
                    L
                ),
                m
            )
        )
    )),
    ,
    1),
    f,
    IFNA(
        d,
        ""
    ),
    DROP(REDUCE("",
    SEQUENCE(
                        3
                    ),
    LAMBDA
(x,
    y,
    VSTACK(
        x,
        LET(
            a,
            IF(
                f=y,
                1,
                0
            ),
            b,
            BYROW(
                a,
                LAMBDA(
                    x,
                    SUM(
                        x
                    )
                )
            ),
            HSTACK(
                y,
                ARRAYTOTEXT(
                    
                    FILTER(
                        A2:A20,
                        b>2
                    )
                )
            )
        )
    ))),
    1))
_x000D_ _x000D_
Excel solution 11 for Rank Regions by Yearly Scores, proposed by Charles Roldan:
=LET(Years,
     B1:H1,
     Regions,
     A2:A20,
     Data,
     B2:H20,
     Headers,
     J2:K2,
     REDUCE(Headers,
     {1;2;3},
     LAMBDA(m,
    n,
     VSTACK(m,
     HSTACK(n,
     ARRAYTOTEXT(FILTER(Regions,
     LAMBDA(
         x,
          x = MAX(
              x
          )
     )(BYROW(
         Regions = TOROW(
             DROP(
                 REDUCE(
                     "",
                      SEQUENCE(
                          COLUMNS(
                              Years
                          )
                      ),
                      LAMBDA(
                          a,
                          b,
                           VSTACK(
                               a,
                                FILTER(
                                    Regions,
                                     LET(
                                         Vals,
                                          CHOOSECOLS(
                                              Data,
                                               b
                                          ),
                                          Vals = LARGE(
                                              UNIQUE(
                                                  Vals
                                              ),
                                               n
                                          )
                                     )
                                )
                           )
                      )
                 ),
                  1
             )
         ),
          LAMBDA(
              x,
               SUM(
                   --x
               )
          )
     )))))))))
_x000D_ _x000D_
Excel solution 12 for Rank Regions by Yearly Scores, proposed by Ankur Sharma:
=LET(a, A2:A20, b, TEXTSPLIT(ARRAYTOTEXT(BYCOL(B2:H20, LAMBDA(c, ARRAYTOTEXT(FILTER(a, c >= LARGE(UNIQUE(c), 3)))))), , ", "), d, MAP(a, LAMBDA(e, SUM(--(b = e)))), f, UNIQUE(d), g, {1;2;3}, HSTACK(g, MAP(g, LAMBDA(h, ARRAYTOTEXT(FILTER(a, d = LARGE(f, h)))))))
_x000D_ _x000D_
Excel solution 13 for Rank Regions by Yearly Scores, proposed by Pieter de Bruijn:
=LET(
    x,
    LAMBDA(
        y,
        BYROW(
            MAKEARRAY(
                19,
                7,
                LAMBDA(
                    r,
                    c,
                    LET(
                        a,
                        --B2:H20,
                        SUM(
                            N(
                                INDEX(
                                    a,
                                    r,
                                    c
                                )<=UNIQUE(
                                    INDEX(
                                        a,
                                        ,
                                        c
                                    )
                                )
                            )
                        )
                    )
                )
            ),
            LAMBDA(
                w,
                SUM(
                    N(
                        w=y
                    )
                )
            )
        )
    ),
    LET(
        z,
        LAMBDA(
            y,
            ARRAYTOTEXT(
                FILTER(
                    A2:A20,
                    x(
                        y
                    )=MAX(
                        x(
                        y
                    )
                    )
                )
            )
        ),
        LET(
            d,
            {1;2;3},
            HSTACK(
                d,
                MAP(
                    d,
                    z
                )
            )
        )
    )
)
_x000D_ _x000D_
Excel solution 14 for Rank Regions by Yearly Scores, proposed by LUIS FLORENTINO COUTO CORTEGOSO:
=LET(r,
    DROP(
        REDUCE(
            "",
            SEQUENCE(
                COLUMNS(
                    B2:H20
                )
            ),
            LAMBDA(
                b,
                x,
                VSTACK(
                    b,
                    REDUCE(
                        "",
                        {1,
                        2,
                        3},
                        LAMBDA(
                            a,
                            y,
                            HSTACK(
                                a,
                                TOCOL(
                                    FILTER(
                                        A2:A20,
                                        --CHOOSECOLS(
                                            B2:H20,
                                            x
                                        )=LARGE(
                                            UNIQUE(
                                                --CHOOSECOLS(
                                            B2:H20,
                                            x
                                        )
                                            ),
                                            y
                                        )
                                    )
                                )
                            )
                        )
                    )
                )
            )
        ),
        ,
        1
    ),
    REDUCE({"Rank",
    "Regions"},
    {1;2;3},
    LAMBDA(a,
    i,
    VSTACK(a,
    HSTACK(i,
    LET(t,
    MAP(A2:A20,
    LAMBDA(x,
    LET(m,
    TOCOL(
        CHOOSECOLS(
            r,
            i
        ),
        3
    ),
    SUM(--(m=x))))),
    TEXTJOIN(
        ", ",
        ,
        FILTER(
            A2:A20,
            t=MAX(
                t
            )
        )
    )))))))
_x000D_ _x000D_
Excel solution 15 for Rank Regions by Yearly Scores, proposed by Alexandra Popoff:
= LAMBDA(
    In_Region,
    In_Year,
    In_Data,
    [In_MaxRank],
    
    LET(
        z_Region,
         In_Region,
        z_Year,
         TRANSPOSE(
             In_Year
         ),
        z_Data,
         VALUE(
             In_Data
         ),
        
         z_Max_Rank,
         if(
             ISOMITTED(
                 In_MaxRank
             ),
             3,
             In_MaxRank
         ),
        
         z_n_Reg,
         ROWS(
             z_Region
         ),
        
         z_Rank,
         MAKEARRAY(
             z_n_Reg,
              ROWS(
                  z_Year
              ),
              LAMBDA(
                  z_y,
                   z_x,
                   XMATCH(
                       INDEX(
                           z_Data,
                            z_y,
                            z_x
                       ),
                        SORT(
                            UNIQUE(
                                INDEX(
                                    z_Data,
                                     ,
                                     z_x
                                )
                            ),
                             ,
                             -1
                        )
                   )
              )
         ),
        
         z_Top,
         MAKEARRAY(
             z_n_Reg,
              z_Max_Rank,
              LAMBDA(
                  z_y,
                   z_x,
                   SUM(
                       N(
                           TRANSPOSE(
                               INDEX(
                                   z_Rank,
                                    z_y
                               )
                           ) = z_x
                       )
                   )
              )
         ),
        
         z_Out,
         BYROW(
             SEQUENCE(
                 z_Max_Rank,
                  1,
                  1,
                  1
             ),
              LAMBDA(
                  z_i,
                   LET(
                       z_Col,
                        INDEX(
                            z_Top,
                             ,
                             INDEX(
                                 z_i,
                                  1,
                                  1
                             )
                        ),
                        TEXTJOIN(
                            ", ",
                             TRUE,
                             FILTER(
                                 z_Region,
                                  z_Col = MAX(
                                      z_Col
                                  )
                             )
                        )
                   )
              )
         ),
        
         z_Out
        
    )
)
_x000D_

Solving the challenge of Rank Regions by Yearly Scores with Python

_x000D_
Python solution 1 for Rank Regions by Yearly Scores, proposed by Konrad Gryczan, PhD:
import pandas as pd
input = pd.read_excel("431 Top 3 Rankings.xlsx", usecols="A:H", nrows=20)
test = pd.read_excel("431 Top 3 Rankings.xlsx",  usecols="J:K", nrows=3, skiprows=1)
result = input.melt(id_vars=["Region"], var_name="year", value_name="result")
result["Rank"] = result.groupby("year")["result"].rank("dense", ascending=False).astype('int64')
result = result[result["Rank"] <= 3]
result = result.groupby(["Region", "Rank"]).size().reset_index(name="n")
result = result.groupby("Rank").apply(lambda x: x[x["n"] == x["n"].max()]).reset_index(drop=True)
result["RegionNo"] = result["Region"].str.extract(r"(d+)").astype(int)
result = result.sort_values(["Rank", "RegionNo"])
result = result.groupby("Rank")["Region"].apply(lambda x: ", ".join(x)).reset_index(name="Regions")
print(result.equals(test)) # True
                    
                  
_x000D_

Solving the challenge of Rank Regions by Yearly Scores with Python in Excel

_x000D_
Python in Excel solution 1 for Rank Regions by Yearly Scores, proposed by Abdallah Ally:
import pandas as pd
file_path = 'Excel_Challenge_431 - Top 3 Rankings.xlsx'
df = pd.read_excel(file_path, usecols='A:H')
# Perform data transformation and cleansing
for col in df.columns[1: ]:
 df[col] = df[col].rank(ascending=False, method='dense').astype(int)
items = {}
for rank in range(1, 4):
 ranks = []
 items[rank] = []
 for row in df.loc[:, :'2024'].iterrows():
 ranks.append(sum([x for x in row[1] if x == rank]))
 df[rank] = pd.Series(ranks)
 regions = df['Region'][df[rank] == max(df[rank])]
 items[rank] = ', '.join(regions)
items = {'Rank': items.keys(), 'Regions': items.values()}
df = pd.DataFrame(items)
print(df')
                    
                  
_x000D_

Solving the challenge of Rank Regions by Yearly Scores with R

_x000D_
R solution 1 for Rank Regions by Yearly Scores, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
input = read_excel("Excel/431 Top 3 Rankings.xlsx", range = "A1:H20")
test = read_excel("Excel/431 Top 3 Rankings.xlsx", range = "J2:K5")
result = input %>%
 pivot_longer(cols = -c(1), names_to = "year", values_to = "result") %>%
 mutate(Rank = dense_rank(desc(result)) %>% as.numeric(), .by = year) %>%
 filter(Rank <= 3) %>%
 summarise(n = n_distinct(year), .by = c("Region", "Rank")) %>%
 mutate(check = n == max(n), .by = "Rank") %>%
 filter(check) %>%
 summarise(Regions = paste(Region, collapse = ", "), .by = "Rank"&) %>%
 arrange(Rank) 
                    
                  
_x000D_ &

Leave a Reply