Power Query系列 - 排序Ranking
難度: ★★☆☆☆(1星)
適用范圍: ★★★☆☆(3星)
概況:
在數據分析中,我們常常需要對數據進行排序,同時我們想知道某個項目或者產品的排名,以方便查閱或對排名靠前的進行特別處理。
應用場景:
以下是幾個應用場景:
- 對前五名銷售進行獎勵
- 對前五名的銷售求和
- 對末3位進行淘汰
- ....
然鵝,排名有多種,下面是小抄:
- 順序排序(1234排序)-這種排序方法對數據的每一行使用序號,而不關心平局/並列。
- 標准比賽排名(1224排序)-也稱為跳過排名的一種形式,該方法為平局分配相同的排名,並且跳過下一個排名值。 在這種情況下,我們的值分別變為1,2,2,4,5 。
- 修改后的比賽排名(1334排序)-與標准比賽排名方法類似,但是跳過的值位於平局之前 。 在這種情況下,我們將得到1,3,3,4,5
- 密集排名(1223排序)-在這種排名方法中,平局/並列(一樣的值)具有相同的排名,但不會跳過下一個值。 在這種情況下,我們有1,2,2,3,4,5。
- 分數排名(1/2.5/2.5/4排序)-這個排名我還沒有見過或用過。
那么,如何在Power Query中進行構建,以便可以在Excel和Power BI和中顯示它們呢?
最終Excel效果顯示如下:
歡迎轉載,請保留原文鏈接和作者信息。O(∩_∩)O謝謝。
Power Query系列 - 排序Ranking
作者:馬丁叔叔 鏈接:http://www.cnblogs.com/lizardbi/p/PowerQuery-POWERBI-Ranking.html
數據模型:
要點:
- 何時加入索引Index
- 用什么分組Grouping方法
一起來實現各種排名方法吧!
如果下載附件,您將看到它具有上面顯示的完整的Excel表格。 為了簡化說明,以下步驟只選取了兩列作為SalesData表:
在Excel表格中選擇一個單元格->數據->從表格/范圍
選擇項目和銷售列->右鍵單擊->刪除其他列
僅作為連接加載
這給了我一個簡單的表,其中僅包含產品名稱和值,如下所示:
產品 | 銷售 |
---|---|
Comvita 康維他 | 500 |
Avitago兒童蜂膠 | 400 |
同仁堂蜂蜜 | 400 |
Aurinda 澳琳達 | 200 |
By-Health 湯臣倍健 | 100 |
如您所見,銷售列已經按降序排序,這是我們對並列排名的關鍵所在。
對於每種排名方法-我們實際上將通過以下方式開始每個新查詢(Query):
引用SalesData查詢 (Reference)
重命名新查詢以表示所展示的排名方法
這意味着我將基於上面的視圖每次給出步驟,因為這是我們從引用步驟中應該得到的。
排名方法1:順序排名(1234排序) (Ordinal Rank)
這種排名方法非常容易創建:
按降序對“銷售”列進行排序
按升序對“項目”列進行排序(按字母順序對關系進行排名)
轉到添加列->索引列->從1開始
重命名索引列為排名
根據需要重新排列列
對,就醬。 它只是向您的數據排序方式添加了一個行號,如下所示:
let Source = SalesData, #"Removed Columns" = Table.RemoveColumns(Source,{"順序排名", "標准競賽排名", "修改競爭排名", "密集排名", "分數排名"}),
#"Added Index" = Table.AddIndexColumn(#"Removed Columns", "Index", 1, 1) in #"Added Index"
結果如下:
Avitago兒童蜂膠和同仁堂蜂蜜在列表中排名第2和第3,但銷售均為400,而默認按照字母順序,分別獲得第2和第3的排名,而Aurinda 澳琳達按銷售排第4。
當然,可以加入相同銷售額的時候按照名字倒敘排名,同仁堂排第2,Avitago排第3。
排名方法2:標准比賽排名 (1224 排序)(Standard Competition Rank)
這種排名方法涉及使用一些分組以使值正確顯示:
按降序對“銷售”列進行排序
添加索引列,從1開始
轉到轉換->組
按銷售列分組
創建以下列:
使用“索引”列上的“最小”運算的排名
使用“所有行”操作的數據
展開項目列
根據需要重新排列列
let Source = SalesData, #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1), #"Grouped Rows" = Table.Group(#"Added Index", {"銷售"}, {{"Rank", each List.Min([Index]), type number}, {"Data", each _, type table}}), #"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", {"產品"}, {"產品"}), #"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "銷售", "Rank"}) in #"Reordered Columns"
結果如下:
結果正確地表明,Avitago兒童蜂膠和同仁堂蜂蜜在列表中排名第2和第3,但銷售均為400,故此,分別獲得第2的排名,而Aurinda 澳琳達(在列表中排名第4)的排名為4,因為並列第二名,故沒有第三名。
排名方法3:修改后的比賽排名 (1334排序)(Modified Competition Rank)
要按照修改后的比賽排名方法創建排名,我們需要:
按降序對“銷售”列進行排序
添加索引列,從1開始
轉到轉換->組
按銷售列分組
創建以下列:
使用“索引”列上的“最大”運算的排名
使用“所有行”操作的數據
展開項目列
根據需要重新排列列
let Source = SalesData, #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1), #"Grouped Rows" = Table.Group(#"Added Index", {"銷售"}, {{"Rank", each List.Max([Index]), type number}, {"Data", each _, type table}}), #"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", {"產品"}, {"產品"}), #"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "銷售", "Rank"}) in #"Reordered Columns"
此排名方法與標准競爭排名之間的唯一區別是,我們使用“索引”列的“最大值”而不是先前方法中使用的“最小值”來創建“排名”列。
結果表明,Avitago兒童蜂膠和同仁堂蜂蜜在列表中排名第2和第3,但銷售均為400,故此,分別獲得第3的排名,而Aurinda 澳琳達(在列表中排名第4)的排名為4。因為並列第三名,故沒有第二名。
排名方法4:密集排名(1223排序)(Dense Rank)
密集排名方法要求更改標准競爭排名方法中步驟的順序。 也就是說,Group By命令必須在添加Index列之前出現:
按降序對“銷售”列進行排序
轉到轉換->組
按銷售列分組
創建以下列:
使用“所有行”操作的數據
添加索引列,從1開始
展開項目列
根據需要重新排列列
let Source = SalesData, #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1), #"Grouped Rows" = Table.Group(#"Added Index", {"銷售"}, {{"Data", each _, type table}}), #"Added Index1" = Table.AddIndexColumn(#"Grouped Rows", "Index", 1, 1), #"Expanded Data" = Table.ExpandTableColumn(#"Added Index1", "Data", {"產品"}, {"產品"}), #"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "銷售", "Index"}), #"Renamed Columns" = Table.RenameColumns(#"Reordered Columns",{{"Index", "Rank"}}) in #"Renamed Columns"
此方法將產生以下結果:
結果正確地表明,Avitago兒童蜂膠和同仁堂蜂蜜在列表中排名第2和第3,但銷售均為400,
故此,分別獲得第3的排名,而Aurinda 澳琳達(在列表中排名第4)的排名為3。
這里與競賽排名和修改后競賽排名不同之處在於,
這里不會跳過任何一位的排名數字。
排名方法5:分數排名 (Fractional Rank)
就像我一開始提到的那樣,我發現這是最奇怪的排名方法之一。
但是,像上面其他的一樣,創建它非常容易。
按降序對“銷售”列進行排序
添加索引列,從1開始
轉到轉換->組
按銷售列分組
創建以下列:
使用“索引”列上的“平均”運算的排名
使用“所有行”操作的數據
展開項目列
根據需要重新排列列
let Source = SalesData, #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1), #"Grouped Rows" = Table.Group(#"Added Index", {"銷售"}, {{"Rank", each List.Average([Index]), type number}, {"Data", each _, type table}}), #"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", {"產品"}, {"產品"}), #"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "銷售", "Rank"}) in #"Reordered Columns"
結果如下:
這個,你在哪里用到過……?
總結
實際上,可以看到,僅對應用分組Grouping方法時所選擇的步驟順序,並且/或者,匯總時進行一些小的修改即可輕松地更改排名方法:
譬如,有的先加入索引列,有的后加;有的用最大值,有的用最小值,有的用平均值。
但是,
如果你熟悉了這些,任何排序方法都難不倒你了!!
當然我們可以使用Excel公式創建每種排名方法,
但,文中的方法用Power Query實現,
醬,我們可以將結果直接加載到Power Pivot或者Power BI中。
(完)