Table.AddFuzzyClusterColumn是Power Query的表函數之一,它可以對數據進行模糊匹配並分組,從而規範數據源中的數據,什麼意思呢?
一個簡單的例子,比如地名「北京」,在數據源中它可能是「北京」,「北京市」,「Beijing」甚至「北平」,而該函數需要解決的,就是由數據錄入不規範,數據本身的標準不統一等原因導致的這種數據雜亂的問題。
為解決此問題,多數情況下,簡單替換的方法顯然不切實際,而該M函數可以使其規範化,這在數據清洗中特別實用。
幸運的是,自PowerBI Desktop上次更新(2020年8月)以來,已增加了對該函數的支持,下文講解其具體用法。
基本用法
對於基本用法,我想引用文檔中的舉例的數據進行說明。首先我們有一個簡單的表,裡面包含英文城市溫哥華和西雅圖(如下),你可以留意到其中的單詞大小寫不一,且存在拼寫錯誤(如seattl):
現在,我們回到Table.AddFuzzyClusterColumn函數,其用法如下:
Table.AddFuzzyClusterColumn(
源表, //【必要】
目標列列名, //【必要】
規整後的列名, //【必要】
其他參數 //【可選】
)
因此,針對以上數據,添加步驟,編寫M語句如下:
= Table.AddFuzzyClusterColumn( #"Changed Type", "Location", "Location_Cleaned" )
這樣,我們就可以得到如下結果,數據得到完美規範:
是不是很厲害!
上面只是基本的用法,利用該函數的可選參數,還有更強大的功能。
進階用法
在進階用法中,會在基本用法的基礎上講解參數的原理和使用方法,此外,處理的數據也改為文檔中未涉及的中文文本。
首先利用以下M語句模擬一個火車站站名不規範的簡易數據表:
---
let
DATA =
Table.FromRecords(
{
[ID = 1, Location = "北京西站"],
[ID = 2, Location = "北京西站"],
[ID = 3, Location = "廣州東站"],
[ID = 4, Location = "廣州東站"],
[ID = 5, Location = "廣州東火車站"],
[ID = 6, Location = "西九龍站"],
[ID = 7, Location = "西九龍站"],
[ID = 8, Location = "西九龍火車站"],
[ID = 9, Location = "香港西九龍站"],
[ID = 10, Location = "HK West Kowloon Railway Station"]
},
type table [ID = nullable number, Location = nullable text]
)
in
DATA
---
數據如下,當然你也可以手動先做好這個數據:
按上文使用Table.AddFuzzyClusterColumn的方式,此處使用第一個可選參數【Culture】。
文檔對該參數的定義是「允許根據區域性特定規則對記錄進行分組」,其實就是該函數默認處理對象是英文字符,如果是其他語言,就應該使用Culture指明要處理的語言。
於是編寫M代碼如下:
= Table.AddFuzzyClusterColumn( DATA,//源表名 "Location", "Location_Cleaned",[Culture="cn-ZH"] )
這樣我們得到如下效果:
現在北京西站這個名稱得到了規範,空格問題得到處理。
但如何處理「廣州東站zhan」這種混雜了拼音的記錄呢?答案是使用強大的【Threshold】參數。
Threshold參數的範圍為0到1.0,默認值是0.8,數值為1代表原數據不做任何處理,其越低代表其在糾正數據時,對數據本身的容錯率越高。
此處將該參數設定為0.6後就解決了此問題。
註:此處你還可以增加IgnoreSpace= true參數顯式地忽略空格。
= Table.AddFuzzyClusterColumn( DATA, "Location", "Location_Cleaned", [ Culture="cn-ZH",Threshold=0.6 ] )
效果如下:
到此我們發現以上方法,還未能解決表中第六行至第十行的命名雜亂問題,PQ沒有足夠的依據去智能地給他們歸類,因為PQ並不清楚西九龍是香港的一個地名,當然更不可能了解"HKWest Kowloon Railway Station"的含義。
為解決此問題,該函數引入了【TransformationTable】參數,這將允許我們自定義一個轉換表,以使得PQ可以按照轉換表的定義來規範數據,從而徹底解決此類問題。
首先,定義轉換表TRANS_TABLE:
= Table.FromRecords({ [From = "西九龍站", To = "香港西九龍站"], [From = "西九龍火車站", To = "香港西九龍站"], [From = "HK West Kowloon Railway Station", To = "香港西九龍站"] }, type table [From = nullable text, To = nullable text] )
轉換表如下:
然後參數中引用該表:
= Table.AddFuzzyClusterColumn(DATA, "Location", "Location_Cleaned", [ Culture="cn-ZH", Threshold=0.6,TransformationTable=TRANS_TABLE ] )
這樣我們就完美地解決了問題。效果如下:
總結
Table.AddFuzzyClusterColumn函數在數據源不規範時十分有用,掌握它的用法就可以輕鬆處理這類問題,但對於企業BI解決方案而言,通過ETL等方式從源頭上解決數據雜亂的問題才是最規範的做法。
知識連結
小必老師新書《Excel人力資源實戰寶典》即將上架。
該書全書彩印,從人力資源管理中的招聘,培訓,員工關係,績效,薪酬,假期與考勤,薪酬與福利,人力資源規劃各個模塊出發,學入淺出地講解Excel操作,公式函數,數據透視表,圖表,Power Query的應用,絕對是你工作中的好幫手。集多年實際經驗,案例豐富,題材新穎,HR職場必備。