前面幾篇博客介紹了 Power Query (簡稱 PQ) 的數(shù)據(jù)源和 M 語言的基礎(chǔ)知識,現(xiàn)在開始進(jìn)入數(shù)據(jù)處理部分。本篇接著介紹 如何在 PQ 中添加列。添加列是很重要的一個操作,在 PQ 的查詢編輯器界面,有一個專門【添加列】功能區(qū)。在講解添加列的過程中,我們會逐步介紹一些相關(guān)知識點和 PQ 的操作細(xì)節(jié)。
本示例基于一個考試分?jǐn)?shù)的清單,做兩個方面的統(tǒng)計:1)按單科分?jǐn)?shù)計算級別( A/B/C/D); 2) 將語數(shù)外的成績分別作為一列,并計算總分
創(chuàng)建 table
創(chuàng)建一個空查詢,進(jìn)入高級編輯器,在編輯器中輸入下面的代碼:
let
scores = {
[Name="張三", Subject="語文", Score= 98],
[Name="李四", Subject="語文", Score= 90],
[Name="張三", Subject="數(shù)學(xué)", Score= 100],
[Name="李四", Subject="數(shù)學(xué)", Score= 87],
[Name="張三", Subject="英語", Score= 60],
[Name="李四", Subject="英語", Score= 72]
},
source = Table.FromRecords(scores)
in
source
點擊完成按鈕,回到查詢編輯器,顯示區(qū)顯示如下:
添加索引列
索引列可以看成記錄的編號,PQ 默認(rèn)從 0 開始,也可以選擇從 1 開始或者自定義。在 PQ 查詢編輯器界面中,切換到功能區(qū)【添加列】,找到【索引列】,這是一個下拉框,選擇 【從 1】:
這樣就添加了一個索引列:
添加索引列背后的 M 語言代碼為:
= Table.AddIndexColumn(source, "索引", 1, 1)
在公式欄中將“索引”改為“No.”,并拖到最左邊:
添加條件列
因為我們要對數(shù)據(jù)進(jìn)行不同的處理,默認(rèn)的查詢名“查詢1”不容易區(qū)分,我們將“查詢1”重命名,并作為數(shù)據(jù)處理的起點:選中左邊“查詢1”,右鍵彈出菜單,重命名為 scoresOriginal。
然后再選中 scoresOriginal,右鍵菜單,選擇“引用”,這樣就根據(jù)查詢 scoresOriginal 創(chuàng)建了一個新的查詢,將新查詢命名為 scoresLevel。因為是引用,所以當(dāng) scoresOriginal 的數(shù)據(jù)變化時, scoresLevel 的數(shù)據(jù)也跟著變化。
選中查詢
scoresLevel,切換到【添加列】,點擊【條件列】:PQ 彈出對話框,在界面中按下圖進(jìn)行輸入:
完成第一個條件后,點擊“添加規(guī)則”,增加一行,設(shè)置第二個條件。用同樣的方法添加后面的條件,最后一個條件寫在 ELSE 里面:
操作過程的動圖如下:

這樣就實現(xiàn)了第一個需求:
進(jìn)入高級編輯器,查看第一個需求步驟的 M 代碼,如下:
let
源 = scoresOriginal,
已添加條件列 = Table.AddColumn(源,
"Level",
each if [Score] >= 90 then "A"
else if [Score] >= 85 then "B"
else if [Score] >= 60 then "C"
else "D")
in
已添加條件列
檢查一下看自己是不是已經(jīng)可以看懂了。如果要查看 Table.AddColumn() 函數(shù)的幫助,包括參數(shù)的含義,有兩種辦法,方法一是查看 Microsoft 的 Docs,比如 Table.AddColumn() 函數(shù)的幫助文檔。第二種方法是新建一個空查詢,在公式欄輸入 =Table.AddColumn 不要輸入函數(shù)后面的括號,然后點擊確定。
行轉(zhuǎn)列
另外一種形式添加條件列是行轉(zhuǎn)列,之前我在博客中介紹過 pandas 中如何實現(xiàn)行轉(zhuǎn)列的方法,大家可以參考:
pandas 行轉(zhuǎn)列一種典型輸出報表的解決方法
在 PQ 中實現(xiàn)行轉(zhuǎn)列思路類似,操作也比較簡單。如果在 Excel 中實現(xiàn)類似的處理,條件復(fù)雜的時候則非常困難。
根據(jù)查詢 scoresOriginal 創(chuàng)建一個引用型的查詢,命名為 scoresTotal,在這個查詢中進(jìn)行匯總。切換到【添加列】功能區(qū),點擊【條件列】,先增加一列,列名為 "Chinese",這一列存儲學(xué)生的語文成績。注意下面界面中,輸出的地方要選擇 Score 這一列,而不是輸入一個值。
我們選擇 Score 列:
看一看動圖:

用同樣的方法,增加 Math 和 English 兩列,完成后的界面如下:
因為最終的輸出每個學(xué)生為一行,需要的數(shù)據(jù)進(jìn)行分組,切換到【轉(zhuǎn)換】功能區(qū),點擊【分組依據(jù)】:
進(jìn)入下面的界面,按照界面設(shè)置要輸出的字段。因為數(shù)據(jù)中包含“語文”、“數(shù)學(xué)”和“英語”,所以我們也需要有三個新列:
點擊確定后,PQ 顯示如下:
添加自定義列
我們還需要計算分?jǐn)?shù)的合計。切換到【添加列】功能區(qū),點擊【自定義列】,進(jìn)入設(shè)置自定義列界面。設(shè)置新列名為 Total,然后雙擊選擇右邊已有的列,設(shè)置公式如下:
點擊確定按鈕,完成第二個需求。完成后,再來看看 M 腳本,應(yīng)該基本上能看懂。
let
源 = scoresOriginal,
已添加條件列 = Table.AddColumn(源, "Chinese", each if [Subject] = "語文" then [Score] else null),
已添加條件列1 = Table.AddColumn(已添加條件列, "Math", each if [Subject] = "數(shù)學(xué)" then [Score] else null),
已添加條件列2 = Table.AddColumn(已添加條件列1, "English", each if [Subject] = "英語" then [Score] else null),
分組的行 = Table.Group(已添加條件列2, {"Name"}, {{"Chinese", each List.Sum([Chinese]), type number}, {"Math", each List.Sum([Math]), type number}, {"English", each List.Sum([English]), type number}}),
已添加自定義 = Table.AddColumn(分組的行, "Total", each [Chinese]+[Math]+[English])
in
已添加自定義
本篇通過一個簡單的示例,演示了如何添加索引列、條件列和自定義列這幾種不同的操作方法。