【強強聯合】在Power BI 中使用Python(2)——數據清洗

【強強聯合】在Power BI 中使用Python(2)——數據清洗


​上一篇文章我們講解了在Power BI中使用Python來獲取數據的一些應用:

這一篇我們將繼續講解如何在Power BI中使用Python進行數據清洗工作。


【強強聯合】在Power BI 中使用Python(2)——數據清洗

其實我們仔細看一下場景1和場景2,它們之間是個逆過程,場景1是從Python獲取數據傳遞到Power BI,而場景2是Power BI或者Power Query獲取了數據,用python來處理。


那麼這個逆過程應該如何操作呢?話不多說,抓緊上車:

【強強聯合】在Power BI 中使用Python(2)——數據清洗


前文我們講過,Python與Power BI的數據傳遞是通過Dataframe格式的數據來實現的。


Python的處理結果以Dataframe形式輸出,M將Dataframe自動轉換為Table格式。M將其Table類型的數據傳遞給Python,Python會自動將Table轉換為Dataframe。


舉個簡單的例子:

首先我們進入Power Query管理器界面,通過新建一個空查詢,並建立一個1到100的列表,再將其轉換為表:

<code># 'dataset' 保留此腳本的輸入數據/<code>
【強強聯合】在Power BI 中使用Python(2)——數據清洗


然後點擊“轉換-運行Python腳本”:

【強強聯合】在Power BI 中使用Python(2)——數據清洗


<code>import pandas as pd/<code>


一行以“#”開頭的語句,在Python的規範中表示註釋,所以這句話並不會運行,它的意思是將你要進行修改的表用dataset來表示,也就是說Python是通過dataset變量來訪問數據的。


理論上我們需要在這個地方鍵入:

<code>import pandas as pd/<code>

以表示我們要使用pandas庫,但是Power BI在調用Python時,自動導入了pandas和matplotlib庫,所以這一行寫不寫都一樣,我們知道下面的代碼是在調用pandas庫即可。


<code>dataset.insert(loc=1,column="add_100",value=dataset["Value"]+100)/<code>


dataset就是源數據表自動換換的dataframe格式數據,“loc=1”代表在第一列數據後插入一列,列名是“add_100”,值是“Value”的值+100,第一行是1,add_100列第一行就是101,以此類推:

【強強聯合】在Power BI 中使用Python(2)——數據清洗


點擊運行,得到的是一個子表,將其展開:

【強強聯合】在Power BI 中使用Python(2)——數據清洗

【強強聯合】在Power BI 中使用Python(2)——數據清洗


準確無誤。


當然,我們也可以繼續在這個表裡進行一系列操作,比如複製一張表,再創建一個新dataframe表:

【強強聯合】在Power BI 中使用Python(2)——數據清洗


運行,得到結果:

【強強聯合】在Power BI 中使用Python(2)——數據清洗


再比如,我們想提取數據的某列,比如上面這張表的“key2”列,我們可以點擊運行Python腳本,並寫入如下的代碼:

【強強聯合】在Power BI 中使用Python(2)——數據清洗

(power query自動對Python添加 #(lf) 用來進行轉義)


當然,以上所說這些功能直接在powerquery中就可以實現,甚至更簡單便捷,所以上述內容都是些:

【強強聯合】在Power BI 中使用Python(2)——數據清洗


嗎?


並!不!是!以上只是在循序漸進地告訴大家,powerquery中是可以用Python進行數據清洗的,並且清楚地告訴大家調用Python的方法,大家應該很熟練了吧。


以下才是重點(當然上面也是):

【強強聯合】在Power BI 中使用Python(2)——數據清洗


在powerquery數據清洗中使用較多的Python功能一定會有正則,因為powerquery本身是沒有正則的,所以這時候調用Python來進行正則就顯得尤為重要,否則你可能需要在powerquery中添加很多步驟也不一定能得到想要的結果。


比如下面這個例子:

【強強聯合】在Power BI 中使用Python(2)——數據清洗

真實情況可能遠遠比這個複雜。


這種數據如果已經導入到Power BI中,在powerquery裡是沒有辦法直接進行處理的,這時候就可以調用Python的re正則表達式了:

<code>import reimport json​# 自定義獲取文本電子郵件的函數def get_find_emails(text):    emails = re.findall(r"[a-z0-9\\.\\-+_]+@[a-z0-9\\.\\-+_]+\\.[a-z]+", text)    emails=';'.join(emails)    return emails​# 自定義獲取文本手機號函數def get_findAll_mobiles(text):    mobiles = re.findall(r"1\\d{10}", text)    mobiles =';'.join(mobiles)    return mobiles​email_list=[]tele_list=[]for i in range(len(dataset)):    text=dataset.iat[i,1]    email=get_find_emails(text)    email_list.append(email)    tele=get_findAll_mobiles(text)    tele_list.append(tele)    dataset['email']=email_listdataset['tele']=tele_list/<code>

正則表達式的使用,大家可以進行相關搜索和學習,網上資源還是很多的。


這段代碼定義了兩個函數:get_find_emails(自定義獲取文本電子郵件的函數)和get_find_mobiles(自定義獲取文本手機號函數),得到兩個list,最後再放入dataset數據表中。


在IDE中運行無誤後複製到powerquery的Python腳本編輯器中:

【強強聯合】在Power BI 中使用Python(2)——數據清洗


點擊確定,返回結果:

【強強聯合】在Power BI 中使用Python(2)——數據清洗


後面兩列就是我們想要的手機號和郵箱了。


這樣我們就實現了在powerquery中使用正則表達式對數據進行清洗的目的。

【強強聯合】在Power BI 中使用Python(2)——數據清洗


當然,也可以調用R、PHP或者js來實現相同的目的,方法大同小異,各位讀者可以自行研究。


本文講解了在powerquery中進行數據清洗工作時如何運用Python來實現一些特定的功能。當然,數據清洗的整個流程是複雜多變的,結合本文所講的內容,希望大家都能充分挖掘powerquery和Python在數據清洗過程中的優缺點,結合起來使用,勢必能事半功倍。


下一篇我們將繼續講解如何使用Python的matplotlib庫在Power BI中進行可視化呈現。


【強強聯合】在Power BI 中使用Python(2)——數據清洗


感謝您對【學謙數據運營】的關注,支持與厚愛,如果您覺得本文對您有用,請不要吝惜您的點贊、轉發、點亮在看,有任何問題歡迎大家在留言區留言,謝謝。


分享到:


相關文章: