如何计算汇总统计数据
来源:Pandas官网:https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html
笔记托管:https://gitee.com/DingJiaxiong/machine-learning-study
文章目录
- 如何计算汇总统计数据
- 导包
- 数据准备
- 【1】如何计算汇总统计数据
- ① 聚合统计信息
- ② 按类别分组的聚合统计信息
- ③ 按类别计算记录数
- 【小结】
导包
import pandas as pd
数据准备
使用存储为 CSV 的泰坦尼克号数据集。数据由以下数据列组成:
- 【PassengerId】乘客 ID:每位乘客的 ID。
- 【Survived】幸存:表明乘客是否幸存。0 表示是,1 表示否。
- 【Pclass】P类:3个机票类别之一:1类,2类和3类.
- 【Name】姓名:乘客姓名。
- 【Sex】性别:乘客的性别。
- 【Age】年龄:乘客的年龄(以岁为单位)。
- SibSp:船上的兄弟姐妹或配偶的数量。
- Parch:船上的父母或孩子人数。
- 【Ticket】票:乘客的票号。
- 【Fare】票价:表示票价。
- 【Cabin】客舱:乘客的客舱号码。
- 【Embarked】登船:登船港。
titanic = pd.read_csv("titanic.csv")
titanic.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
【1】如何计算汇总统计数据
① 聚合统计信息
泰坦尼克号乘客的平均年龄是多少?
titanic['Age'].mean()
29.69911764705882
可以使用不同的统计信息,并且可以应用于具有数值数据的列。默认情况下,操作通常会排除缺失的数据并跨行操作。
泰坦尼克号乘客的年龄和票价中位数是多少?
titanic[['Age', 'Fare']].median()
Age 28.0000
Fare 14.4542
dtype: float64
应用于DataFrame 的多个列的统计信息(选择两列将返回一个数据DataFrame)是针对每个数字列计算的。
可以同时计算多个列的聚合统计信息。
titanic[['Age', 'Fare']].describe()
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() 方法定义给定列的聚合统计信息的特定组合,而不是预定义的统计信息:
titanic.agg(
{
"Age": ["min", "max", "median", "skew"],
"Fare": ["min", "max", "median", "mean"]
}
)
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 |
② 按类别分组的聚合统计信息
男性与女性泰坦尼克号乘客的平均年龄是多少?
titanic[['Sex', 'Age']].groupby("Sex").mean()
Age | |
---|---|
Sex | |
female | 27.915709 |
male | 30.726645 |
由于我们感兴趣的是每个性别的平均年龄,因此首先对这两列进行子选择:titanic[[“Sex”, “Age”]]接下来,groupby() 方法应用于 Sex 列以按类别创建一个组。计算并返回每个性别的平均年龄。
为列中的每个类别(例如Sex列中的男性/女性)计算给定的统计数据(例如mean是一种常见的模式。groupby方法用于支持此类操作。这符合更一般的split-apply-combine模式:
- 将数据拆分为多个组
- 将函数单独应用于每个组
- 将结果合并到数据结构中
应用和组合步骤通常在pandas中一起完成。
在前面的示例中,我们首先显式选择了 2 列。如果不是,则通过传递 numeric_only=True 将 mean 方法应用于包含数字列的每个列:
titanic.groupby("Sex").mean(numeric_only=True)
PassengerId | Survived | Pclass | Age | SibSp | Parch | Fare | |
---|---|---|---|---|---|---|---|
Sex | |||||||
female | 431.028662 | 0.742038 | 2.159236 | 27.915709 | 0.694268 | 0.649682 | 44.479818 |
male | 454.147314 | 0.188908 | 2.389948 | 30.726645 | 0.429809 | 0.235702 | 25.523893 |
获取 Pclass的平均值没有多大意义。如果我们只对每个性别的平均年龄感兴趣,则分组数据也支持选择列(像往常一样使用矩形括号 []):
titanic.groupby("Sex")["Age"].mean()
Sex
female 27.915709
male 30.726645
Name: Age, dtype: float64
【注意】Pclass 列包含数值数据,但实际上表示 3 个类别(或因素),分别带有标签“1”、“2”和“3”。计算这些统计数据没有多大意义。因此,pandas 提供了一个Categorical数据类型来处理这种类型的数据。
每种性别和舱位等级组合的平均票价是多少?
titanic.groupby(["Sex", "Pclass"])["Fare"].mean()
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() 方法。
③ 按类别计算记录数
每个舱位等级的乘客人数是多少?
titanic["Pclass"].value_counts()
3 491
1 216
2 184
Name: Pclass, dtype: int64
value_counts() 方法计算列中每个类别的记录数。
该函数是一个快捷方式,因为它实际上是一个分组操作,与每个组中的记录数计数相结合:
titanic.groupby("Pclass")["Pclass"].count()
Pclass
1 216
2 184
3 491
Name: Pclass, dtype: int64
size和count都可以与groupby。size包括 NaN 值,并且只提供行数(表的大小),而 count 不包括缺失值。在 value_counts 方法中,使用 dropna 参数包含或排除 NaN 值。
【小结】
可以对整列或整行计算聚合统计信息。
groupby 提供了拆分-应用-组合模式的强大功能。
value_counts 是计算变量每个类别中的条目数的便捷快捷方式。