利用Pandas找出『陰盛陽衰』的大專院校

--

目前,台灣有多少大專院校會出現『陰盛陽衰』的現象?關於這個問題,我們可以透過Pandas的groupby()方法來找出答案。該功能非常強大,可以讓我們根據某個欄位的資料來分組,進而比較不同欄位的內容。

此處,我們將透過政府資料開放平台,下載109學年度的大專院校校別學生數資料集,然後對其進行分析。小編已將相關資料集放至Github,以便讀者直接讀取。首先,讓我們讀入資料集,並檢視前10列的資料:

欄位的數量看起來有點多,為了方便處理,我們只取出數個感興趣的欄位(『學校名稱』、『男生計』及『女生計』)進行分析即可。在取出特定欄位後,來調整一下欄位名稱,並檢視前10列的資料:

在Male欄位及Female欄位中,大於1000的數字都會用逗點來區隔(例如:『1000』會寫成『1,000』)。因此,電腦會將其中的資料視為字串,而非數值。若我們想比較這些欄位的數值資訊,就必須使用str.replace()將資料中的逗點拿掉,並使用astype()將欄位型別轉換為整數。

此外,小編在檢視原始CSV檔時發現,Male欄位和Female欄位中存在缺失值(以『-』來表示),如果不對此進行處理,就無法將它們轉換為數值欄位。同樣地,我們使用str.replace()來將這兩個欄位中的『-』取代為『0』。

至此,我們已經成功將與人數有關的欄位改成數值欄位了。接著,利用assign()將已清理過的欄位放回原本的DataFrame中。

假設我們想知道有幾所學校的女生人數較多,該怎麼做?請注意!原始資料集將學生資訊又細分為了博士班、碩士班等,所以同一所學校會有很多列的資料。我們得將某一學校中,不同列(即:博士班、碩士班等)的資料分別加總,然後才能比較學校間男女學生的人數。聽過去有些複雜,但幸好,我們可以用Pandas內建的groupby()先根據School欄位對資料進行分組。

呼叫groupby()後會得到groupby物件,其可用來進行聚合(aggregation)運算。何謂聚合?當我們彙總某一序列的資料,並傳回單一輸出值時,就是在進行聚合運算。計算某一數值欄位的最大值,就屬於聚合運算的一種。

在此處,我們先根據School欄位中的資料分組(因此,同一學校的資料會分到同一組),然後再對不同組別中,博士班、碩士班及學士班的男女學生人數進行加總,進而傳回該校的男生及女生總數。

為了進行加總,我們還需要兩個元素:聚合欄位聚合函式。顧名思義,聚合欄位就是要進行聚合的欄位(即:Male欄位和Female欄位),而聚合函式則是進行聚合的方法,包括:sum()、min()、max()等。由於我們想對對同一個欄位的多列資料進行加總,因此所用的聚合函式即sum()。

有了各校的男生及女生總數後,便可建立一個布林遮罩(mask),篩選出女生人數大於男生人數的學校。將該遮罩傳入剛剛分組聚合輸出的DataFrame後,就可找到符合我們條件的學校了。

從輸出可見,共有71所大專院校的男生人數是大於女生人數的。我們可以進一步透過以下程式,找出『男生多於女生』的大專院校所佔之百分比

以上程式的運行結果約為53.29,換句話說,在超過半數的大專院校中,會出現『陰盛陽衰』的現象。以上的程式範例已放到Colab筆記本中,有興趣的讀者可以自己跑跑看。

事實上,groupby()的功能不僅於此,讀者可以嘗試創建自己的聚合函式,並搭配groupby物件來一起使用。若想了解更多的範例,歡迎參考旗標出版的《Python資料分析必備套件!Pandas資料清理、重塑、過濾、視覺化》一書。全書涵蓋了 Pandas 資料分析的 114 技,保證您學好學滿!現正與《NumPy 高速運算徹底解說》合購75折優惠中,兩個Python熱門套件,幫您一次搞定!

--

--

施威銘研究室
施威銘研究室

Written by 施威銘研究室

致力開發AI領域的圖書、創客、教具,希望培養更多的AI人才。整合各種人才,投入創客產品的開發,推廣「實作學習」,希望實踐學以致用的理想。

No responses yet