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]
如何計算摘要統計資料#
彙總統計資料#
鐵達尼號乘客的平均年齡是多少?
In [4]: titanic["Age"].mean() Out[4]: 29.69911764705882
有許多不同的統計資料可供使用,並可套用於包含數字資料的欄。一般而言,運算會排除遺失的資料,並預設橫跨列進行運算。
鐵達尼號乘客的中位數年齡和票價是多少?
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
使用者指南中關於 描述性統計資料 的部分提供了描述性統計資料的詳細資料。
依類別分組的彙總統計資料#
鐵達尼號男性和女性乘客的平均年齡是多少?
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
注意
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 操作 部分提供了關於拆分-套用-合併方法的完整說明。
依類別計算記錄數#
每個艙等的乘客數是多少?
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
注意
size
和 count
都可以與 groupby
結合使用。 size
包含 NaN
值,只提供列數(表格大小),而 count
排除遺失值。在 value_counts
方法中,使用 dropna
參數來包含或排除 NaN
值。
使用者指南有一個專門關於 value_counts
的部分,請參閱 離散化 頁面。
請記住
聚合統計資料可以計算在整個欄位或列中。
groupby
提供了 分割-套用-組合 樣式的功能。value_counts
是計算變數中每個類別的條目數的便捷捷徑。
關於分割-套用-組合方法的完整說明,請參閱使用者指南頁面關於 groupby 操作。