iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
AI & Data

看對話學 Python 資料分析,用情境故事帶你入門系列 第 23

Day-23 學會進階資料處理(上),pandas concat 及條件篩選

  • 分享至 

  • xImage
  •  


利用 pandas 合併資料,並且建立篩選條件。Licensed by Adobe Stock

Meiko:「前一次你跟我講了用那個功夫熊貓的 pandas 進行資料計算感覺很方便耶!」

Jason:「對啊,而且 pandas 不只可以進行單一個檔案的分析,它還可以把不同檔案串起來進行分析唷!」

Meiko:「這麼神奇!你趕快 show 給我看!」

Jason:「那我先考你一題,你覺得在結帳的時候,除了你自己的餐點之外,你還會在結帳單上面看到什麼資訊?」

Meiko:「應該會有消費的時間吧?...然後可能還會有是哪個服務生在服務。」

Jason:「你記得日式咖哩店的結帳櫃檯,服務生最後還請你給他們一個評比的分數?」

Meiko:「歐,想起來了,有那個 1~5 顆星的評比,我記得他們說如果有評分的話,會加贈一個下次可以使用的兌換卷。」

Jason:「差不多就這些囉,剛好老闆給我另外一份檔案,裡面就有時間的資訊、服務生的資訊以及評比的分數。」

Jason:「那我問你,如果想要知道資料長什麼樣子,你現在會做什麼?」

Meiko:「當然是先讀進資料,然後再用.head()看一下資料長的是什麼樣子囉!」

我大寶寶拉~請到這個連結下載檔案後,再解壓縮,並且上傳到自己的 Colab 檔案上傳區,跟Day-20上傳 json 檔案是一樣的做法。

import pandas as pd
pdTimeAndService=pd.read_excel("curryTimeAndService.xlsx",sheet_name="Sheet1")
pdTimeAndService.head()

Jason:「不錯唷,你馬上就學起來了!」

Meiko:「那當然,不過現在看起來只有訂單名稱,能不能把這份資料跟銷售相關的資料綁在一起看啊?」

Jason:「哈,這就是我今天要跟你說的呀!可以用concat的方式來進行!」

pdTotal = pd.concat([pdCurrySales,pdTimeAndService],axis=1) 
pdTotal.head()

Meiko:「哇,原來用concat就可以把兩份檔案的內容合併一起看!不過 Jason 在合併的最後怎麼會有一個 axis=1 的東西?」

Jason:「歐,它是一個設定,看你是要合併在整份檔案的最下面那一列(axis=0),或者你要是行的方式(axis=1)去合併,所以這邊代表用行的方式合併!」

Meiko:「了解,這樣我就知道了,原來合併的方式可以這樣用!」

Jason:「餐廳老闆想知道,在尖峰時段用餐的訂單數,比如說中午 12:00~1:30 PM,還有晚餐6:00~9:00 PM 之間有多少人,Meiko,你有什麼想法?」

Meiko:「這感覺跟先前你跟我說判斷消費的金額好像有點類似,我猜是要想辦法抓取你剛講的兩個區間,然後計算一下總共有多少訂單?」

Jason:「蠻接近的,我們先從一個簡單的時間區間開始好了,因為咖哩店 12:00 才開,所以我們要看中午時間賣出了多少份,只要設定條件是在下午 1:30PM 之前就可以了」

from datetime import datetime

d1 = datetime.strptime('10/1/2020 1:30 PM', '%m/%d/%Y %I:%M %p')

date_mask = (pdTotal['time'] < d1)
pdTotalResult = pdTotal[date_mask]

print (pdTotalResult)

Meiko:「歐,Jason,雖然才短短的程式而已,可是我好像已經變得頭昏眼花了耶!」

Jason:「別急,我一個個講給你聽。」

d1 = datetime.strptime('10/1/2020 1:30 PM', '%m/%d/%Y %I:%M %p')

Jason:「這邊的意思,我們是把字串轉換成datetime物件,至於為什麼要轉換成datetime的物件,概念就是要讓程式容易做比對。我們人眼看字串,程式看datetime,有這樣的初步認識就可以囉!」

.strptime(string, format)

Jason:「我們進一步看string是你輸入的時間字串,像這邊我們輸入的字串是'10/1/2020 1:30 PM'。而format就是程式需要轉換字串的格式,其實就是依照前面的字串,給定特定的代碼,%m是月份,%d是日期,%Y是哪一年,%I是小時,%M是分鐘,%p是AM/PM的代稱。」

Meiko:「聽你這樣一講,我好像就懂了耶!原來拆開來看並不難嘛,可是一次蹦出很多新的東西,我就有點擔心。」

Jason:「是囉!那我繼續說,你剛有提到先前在做價格的if-else判斷的時候有用><這類的符號。那這行的意思就是先把『想要比較的條件』給設定好,比如說我們想要知道在 1:30 PM 前有多少個,這就是我們的條件,然後我們把這個條件設定成變數date_mask

date_mask = (pdTotal['time'] < d1)

Meiko:「歐,先設定好條件再帶入的意思嗎?」

Jason:「沒錯!我們再利用下面這行,等於說去設定一個條件,把這批資料都篩選過一次的概念!」

pdTotalResult = pdTotal[date_mask]

Meiko:「這樣我就懂了,我們先設定好要在 1:30 PM 這個條件,然後我們再去欄位 time 中去篩選符合這個條件的所有資料?」

Jason:「答對囉!那你現在可以試試看,要怎麼找到晚上 6:00PM ~9:00PM 的訂單?」

from datetime import datetime

d1 = datetime.strptime('10/1/2020 6:00 PM', '%m/%d/%Y %I:%M %p')
d2 = datetime.strptime('10/1/2020 9:00 PM', '%m/%d/%Y %I:%M %p')

date_mask = (pdTotal['time'] < d2) & (pdTotal['time'] > d1)
pdTotalResult = pdTotal[date_mask]
print (pdTotalResult)

Jason:「不錯唷,你已經知道可以用&的方式,把兩個條件併在一起了耶!」

Meiko:「哈,雖然你沒教過我,但是我後來上網查了一下,如果要兩個條件同時成立的話,可以用 & 符號。因為想要的區間是在 6:00 PM 到 9:00 PM 之間,所以我想時間的關係應該是要大於 > 6:00 PM 然後小於 < 9:00 PM 才是。」

Jason:「你漸漸有點感覺囉!」

Meiko:「哈,那我最後快速問你一個問題,你看我們現在看全部的資料可能太多了,有沒有快一點知道這份資料的長度有多少啊?」

Jason:「A piece of cake,你只要用len就可以知道長度囉!」

len(pdTotalResult)

Meiko:「這樣看來,真的想到怎麼做,好像馬上就可以做到了!」

牛刀小試

我大寶寶~拉,今天我們談到了concat來做兩份試算表的合併,也談到利用時間的關係,設定條件篩選挑出自己感興趣的資料,操作的內容稍嫌複雜,但是概念其實都蠻容易理解的。在資料分析裡面有探索式資料分析 Explore Data Analysis (EDA)的說法,就是用些簡單的統計方法或是一些資料篩選的方式,去了解資料的輪廓,想辦法找到特徵。接下來幾天會有更多的介紹...

給大寶寶留言、分享、鼓勵

歡迎登入留言跟我分享你的想法唷!(登入不麻煩,點一下 FB 登入就可以留言了!)

1.喜歡這樣方式學 Python 的朋友請留言『+1』
2.如果前面的內容忘記了,趕快看一下大寶寶這一系列的看對話學 Python 資料分析,用情境故事帶你入門的列表!就能夠繼續 Happy Coding 囉!


上一篇
Day-22 開檔讀檔,學會讀取檔並進行簡單計算(下)
下一篇
Day-24 學會進階資料處理(中),處理數據背後的商業邏輯
系列文
看對話學 Python 資料分析,用情境故事帶你入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言