Pandas 103:更多基礎資料框技巧

如何排序、衍生變數、摘要與分組摘要

郭耀仁 Yao-Jen Kuo
Sep 9 · 7 min read

Many data analysis problems involve the application of a split-apply-combine strategy, where you break up a big problem into manageable pieces, operate on each piece independently and then put all the pieces back together.

Hadley Wickham

TL; DR 摘要

這個小節簡介了如何對資料框進行排序、衍生變數、摘要與分組摘要等更多的基礎技巧。


在這個小節中我們常會需要在一個 Jupyter Notebook 的儲存格中顯示多個物件,但為了漂亮的資料框外觀不想使用 print() 函數,於是在筆記本的第一個儲存格加入額外設定,讓原本預設只顯示儲存格最後一個物件更改為顯示所有物件。

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

排序

Pandas 的資料框排序可以呼叫兩個方法:

  • df.sort_index() :依照資料框的列標籤遞增(預設)或遞減排序
  • df.sort_values() :依照指定的資料框欄標籤遞增(預設)或遞減排序
依照資料框的列標籤遞增(預設)或遞減排序
依照指定的資料框欄標籤遞增(預設)或遞減排序

衍生變數

我們常會需要對資料框中的變數生成衍生變數,常見的操作有:

  • 簡單運算
  • 類別對應類別
  • 數值對應類別
  • 函數映射

簡單運算透過 Series 從 ndarray 繼承而來的元素級別運算(element-wise operation)特性即可實踐,像是運用身高、體重這兩個欄位衍生出球員的 BMI。

運用身高、體重這兩個欄位衍生出球員的 BMI

類別對應類別可以透過 Series 的 .map() 方法來實踐,傳入 dict 作為對應的準則,字典的鍵(Key)為對應前的原始類別,字典的值(Value)為對應後的類別,例如將本來分類較細膩的鋒衛對應為較粗略的前場、後場。

## Pos before mapping:
## G 200
## F 186
## C 51
## G-F 39
## F-C 20
## F-G 15
## C-F 13
## Name: pos, dtype: int64
##
## Pos after mapping:
## Frontcourt 285
## Backcourt 239
## Name: pos_recoded, dtype: int64

數值對應類別可以透過 pd.cut() 函數將數值變數依照指定的門檻值或箱數切分成為類別變數,舉例來說將身高對應為小於等於 2 公尺以及超過 2 公尺兩個類別。

將身高對應為小於等於 2 公尺以及超過 2 公尺兩個類別

函數映射可以透過 .apply() 方法來實踐,傳入函數或 lambda 表示式作為映射的準則,例如將本來分類較細膩的鋒衛對應為較粗略的 G、F 與 C。

## Pos before applying:
## G 200
## F 186
## C 51
## G-F 39
## F-C 20
## F-G 15
## C-F 13
## Name: pos, dtype: int64
##
## Pos after applying:
## G 239
## F 221
## C 64
## Name: pos_recoded, dtype: int64

摘要

我們可以對資料框呼叫常用的摘要方法:

  • .count() 計算列數
  • .mean().median() 計算平均和中位數
  • .min().max() 計算最小和最大值
  • .std().var() 計算標準差和變異數
  • .prod() 計算乘積
  • .sum() 計算總和

這些摘要方法預設作用的維度是資料框的欄位,比方從上映年份、評等與片長三個變數中取出各自的最大值;如果更動參數 axis=1 則會改作用在資料框列的維度上,變成將四部電影各自的最大值取出,就會變成每一部電影都是取出上映年份,在這兩個摘要範例中,前者採預設值 axis=0 是明顯比較有意義的。

## rating                  9.0
## release_year 2010.0
## movie_length_mins 195.0
## dtype: float64
##
## The Dark Knight 2008.0
## Schindler's List 1993.0
## Forrest Gump 1994.0
## Inception 2010.0
## dtype: float64

分組摘要

更多的應用情境中我們會指定一些類別變數分組,在分組的前提下對資料框變數呼叫簡單的摘要方法,這樣的操作源自於 SQL 資料庫查詢語言的 GROUP BY 語法,或 R 語言大師 Hadley Wickham 所定義的 split-apply-combine 資料分析策略。呼叫資料框的 .groupby() 方法並指定類別變數可以創建出 GroupBy 物件,我們可以將 GroupBy 物件視為 DataFrame 的 generator 或 View,在指定數值變數與摘要方法之前不會產生運算結果。

## <class 'pandas.core.groupby.generic.DataFrameGroupBy'>

指定 GroupBy 物件變數與摘要方法之後就會獲得運算結果,像是依照鋒衛位置(pos)計算平均身高與體重。

## C      2.126863
## C-F 2.090000
## F 2.044378
## F-C 2.107500
## F-G 1.995333
## G 1.924800
## G-F 2.000000
## Name: heightMeters, dtype: float64
##
## pos
## C 114.335294
## C-F 110.676923
## F 101.589730
## F-C 110.855000
## F-G 95.126667
## G 88.896000
## G-F 95.717949
## Name: weightKilograms, dtype: float64

截至目前為止,我們掌握了更多資料框的基本操作,包含排序、衍生變數、摘要與分組摘要,準備好在後續的小節研究如何做進階的處理、操作及運算。


DataInPoint

DataInPoint 是一個超棒的資料科學專欄,主題涵蓋資料、程式、機器學習與高效能運算。

郭耀仁 Yao-Jen Kuo

Written by

Could that data be any tidier? It is always nice to meet a data enthusiast / 2:43 marathon runner.

DataInPoint

DataInPoint 是一個超棒的資料科學專欄,主題涵蓋資料、程式、機器學習與高效能運算。

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade