In [1]: import pandas as pd
用於本教學課程的資料
  • 本教學課程使用鐵達尼號資料集,儲存為 CSV。資料包含下列資料欄

    • PassengerId:每位乘客的 ID。

    • Survived:表示乘客是否存活。 0 表示是, 1 表示否。

    • Pclass:3 種票價艙等之一:艙等 1、艙等 2 和艙等 3

    • Name:乘客姓名。

    • Sex:乘客性別。

    • Age:乘客年齡(歲)。

    • SibSp:船上兄弟姊妹或配偶的數量。

    • Parch:船上父母或子女的數量。

    • Ticket:乘客的票號。

    • Fare:表示票價。

    • Cabin:乘客的艙房號碼。

    • Embarked:登船港口。

    至原始資料
    In [2]: titanic = pd.read_csv("data/titanic.csv")
    
    In [3]: titanic.head()
    Out[3]: 
       PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
    0            1         0       3  ...   7.2500   NaN         S
    1            2         1       1  ...  71.2833   C85         C
    2            3         1       3  ...   7.9250   NaN         S
    3            4         1       1  ...  53.1000  C123         S
    4            5         0       3  ...   8.0500   NaN         S
    
    [5 rows x 12 columns]
    

如何計算摘要統計資料#

彙總統計資料#

../../_images/06_aggregate.svg
  • 鐵達尼號乘客的平均年齡是多少?

    In [4]: titanic["Age"].mean()
    Out[4]: 29.69911764705882
    

有許多不同的統計資料可供使用,並可套用於包含數字資料的欄。一般而言,運算會排除遺失的資料,並預設橫跨列進行運算。

../../_images/06_reduction.svg
  • 鐵達尼號乘客的中位數年齡和票價是多少?

    In [5]: titanic[["Age", "Fare"]].median()
    Out[5]: 
    Age     28.0000
    Fare    14.4542
    dtype: float64
    

    套用於 DataFrame 多個欄位的統計資料(選取兩個欄位會傳回 DataFrame,請參閱 子集資料教學課程)會針對每個數字欄位計算。

彙總統計資料可以同時針對多個欄位計算。還記得 第一個教學課程 中的 describe 函數嗎?

In [6]: titanic[["Age", "Fare"]].describe()
Out[6]: 
              Age        Fare
count  714.000000  891.000000
mean    29.699118   32.204208
std     14.526497   49.693429
min      0.420000    0.000000
25%     20.125000    7.910400
50%     28.000000   14.454200
75%     38.000000   31.000000
max     80.000000  512.329200

除了預先定義的統計資料,也可以使用 DataFrame.agg() 方法針對特定欄位定義彙總統計資料的特定組合。

In [7]: titanic.agg(
   ...:     {
   ...:         "Age": ["min", "max", "median", "skew"],
   ...:         "Fare": ["min", "max", "median", "mean"],
   ...:     }
   ...: )
   ...: 
Out[7]: 
              Age        Fare
min      0.420000    0.000000
max     80.000000  512.329200
median  28.000000   14.454200
skew     0.389108         NaN
mean          NaN   32.204208
至使用者指南

使用者指南中關於 描述性統計資料 的部分提供了描述性統計資料的詳細資料。

依類別分組的彙總統計資料#

../../_images/06_groupby.svg
  • 鐵達尼號男性和女性乘客的平均年齡是多少?

    In [8]: titanic[["Sex", "Age"]].groupby("Sex").mean()
    Out[8]: 
                  Age
    Sex              
    female  27.915709
    male    30.726645
    

    由於我們感興趣的是每個性別的平均年齡,因此會先針對這兩個欄位進行子選取: titanic[["Sex", "Age"]]。接著,將 groupby() 方法套用於 Sex 欄位,以針對每個類別建立一個群組。系統會計算並傳回每個性別的平均年齡。

計算特定統計資料(例如 平均 年齡)針對每個類別中的欄位(例如 Sex 欄位中的男性/女性)是一種常見的模式。groupby 方法用於支援這種類型的運算。這符合更通用的 分割-套用-合併 模式

  • 分割資料成群組

  • 套用函式至每個群組,獨立運作

  • 合併結果為資料結構

套用和合併步驟通常在 pandas 中一起完成。

在前一個範例中,我們明確地先選擇 2 個欄位。如果不是這樣,平均 方法會套用至包含數字欄位的每個欄位,方法是傳遞 numeric_only=True

In [9]: titanic.groupby("Sex").mean(numeric_only=True)
Out[9]: 
        PassengerId  Survived    Pclass  ...     SibSp     Parch       Fare
Sex                                      ...                               
female   431.028662  0.742038  2.159236  ...  0.694268  0.649682  44.479818
male     454.147314  0.188908  2.389948  ...  0.429809  0.235702  25.523893

[2 rows x 7 columns]

取得 Pclass 的平均值沒有太大意義。如果我們只對每個性別的平均年齡有興趣,那麼欄位選取(矩形括弧 [] 如同平常)也支援群組資料

In [10]: titanic.groupby("Sex")["Age"].mean()
Out[10]: 
Sex
female    27.915709
male      30.726645
Name: Age, dtype: float64
../../_images/06_groupby_select_detail.svg

注意

Pclass 欄位包含數字資料,但實際上代表 3 個類別(或因子),分別標記為「1」、「2」和「3」。對這些類別計算統計資料沒有太大意義。因此,pandas 提供 Categorical 資料類型來處理這種類型的資料。使用者指南 分類資料 部分提供了更多資訊。

  • 每個性別和艙等組合的平均票價是多少?

    In [11]: titanic.groupby(["Sex", "Pclass"])["Fare"].mean()
    Out[11]: 
    Sex     Pclass
    female  1         106.125798
            2          21.970121
            3          16.118810
    male    1          67.226127
            2          19.741782
            3          12.661633
    Name: Fare, dtype: float64
    

    群組可以同時由多個欄位進行。將欄位名稱作為清單提供給 groupby() 方法。

至使用者指南

使用者指南中 groupby 操作 部分提供了關於拆分-套用-合併方法的完整說明。

依類別計算記錄數#

../../_images/06_valuecounts.svg
  • 每個艙等的乘客數是多少?

    In [12]: titanic["Pclass"].value_counts()
    Out[12]: 
    Pclass
    3    491
    1    216
    2    184
    Name: count, dtype: int64
    

    value_counts() 方法計算欄位中每個類別的記錄數。

這個函式是一個捷徑,因為它實際上是群組操作,結合計算每個群組內的記錄數。

In [13]: titanic.groupby("Pclass")["Pclass"].count()
Out[13]: 
Pclass
1    216
2    184
3    491
Name: Pclass, dtype: int64

注意

sizecount 都可以與 groupby 結合使用。 size 包含 NaN 值,只提供列數(表格大小),而 count 排除遺失值。在 value_counts 方法中,使用 dropna 參數來包含或排除 NaN 值。

至使用者指南

使用者指南有一個專門關於 value_counts 的部分,請參閱 離散化 頁面。

請記住

  • 聚合統計資料可以計算在整個欄位或列中。

  • groupby 提供了 分割-套用-組合 樣式的功能。

  • value_counts 是計算變數中每個類別的條目數的便捷捷徑。

至使用者指南

關於分割-套用-組合方法的完整說明,請參閱使用者指南頁面關於 groupby 操作