复习:在前面我们已经学习了Pandas基础,第二章我们开始进入数据分析的业务部分,在第二章第一节的内容中,我们学习了数据的清洗,这一部分十分重要,只有数据变得相对干净,我们之后对数据的分析才可以更有力。而这一节,我们要做的是数据重构,数据重构依旧属于数据理解(准备)的范围。
# 导入基本库
import numpy as np
import pandas as pd
# 载入上一个任务保存的文件中:result.csv,并查看这个文件
result = pd.read_csv("result.csv")
result.head()
Unnamed: 0 | PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, observed=False, dropna=True)
可以实现数据的分组及组内运算。
参数:
结果:
带索引的表格
在groupby方法后可以使用sum、mean等统计方法,进行的是组内运算
# 写入代码
task2 = result["Fare"].groupby(result["Sex"]).mean()
task2
Sex
female 44.479818
male 25.523893
Name: Fare, dtype: float64
在了解GroupBy机制之后,运用这个机制完成一系列的操作,来达到我们的目的。
下面通过几个任务来熟悉GroupBy机制。
# 写入代码
task3 = result["Survived"].groupby(result["Sex"]).sum()
task3
Sex
female 233
male 109
Name: Survived, dtype: int64
# 写入代码
result["Survived"].groupby(result["Pclass"]).sum()
Pclass
1 136
2 87
3 119
Name: Survived, dtype: int64
【提示:】表中的存活那一栏,可以发现如果还活着记为1,死亡记为0
【思考】从数据分析的角度,上面的统计结果可以得出那些结论
通过任务二可以发现女性乘客的平均票价高于男性
通过任务三可以发现女性乘客的存活人数高于男性
通过任务四可以发现1级客舱和3级客舱的存活人数相对较高
由此猜测,1)是否女性乘客多选择1级客舱或3级客舱?2)是否平均票价高的客舱存活人数也较高?存活率呢?
通过下面的处理可以看出:1)女性乘客多选择1级客舱或3级客舱;2)1级客舱的票价相对较高,其存活人数最高,存活率也最高;3级客舱的存活人数虽然也较高,但其乘客最多,存活率最低,因此形成易存活的表象
#查看女性乘客的客舱选择分布
result[result["Sex"]=="female"]["Sex"].groupby(result["Pclass"]).count()
Pclass
1 94
2 76
3 144
Name: Sex, dtype: int64
#查看不同客舱的平均票价
result["Fare"].groupby(result["Pclass"]).mean()
Pclass
1 84.154687
2 20.662183
3 13.675550
Name: Fare, dtype: float64
#查看不同客舱的原有人数
result["PassengerId"].groupby(result["Pclass"]).count()
Pclass
1 216
2 184
3 491
Name: PassengerId, dtype: int64
#查看不同客舱的存活率
result["Survived"].groupby(result["Pclass"]).sum()/result["PassengerId"].groupby(result["Pclass"]).count()
Pclass
1 0.629630
2 0.472826
3 0.242363
dtype: float64
【思考】从任务二到任务三中,这些运算可以通过agg()函数来同时计算。并且可以使用rename函数修改列名。你可以按照提示写出这个过程吗?
**DataFrame.agg(func=None, axis=0, *args, kwargs) 或 **GroupBy.agg(func, *args, kwargs)
在指定轴上使用一个或多个操作进行聚合。
参数:
返回:
带索引的表格
#思考心得
result.groupby(result["Sex"]).agg({"Fare":"mean", "Survived":"sum"}).rename(columns={"Fare":"mean_fare", "Survived":"count_survived"})
mean_fare | count_survived | |
---|---|---|
Sex | ||
female | 44.479818 | 233 |
male | 25.523893 | 109 |
# 写入代码
result.groupby(["Pclass","Age"])["Fare"].mean()
Pclass Age
1 0.92 151.5500
2.00 151.5500
4.00 81.8583
11.00 120.0000
14.00 120.0000
...
3 61.00 6.2375
63.00 9.5875
65.00 7.7500
70.50 7.7500
74.00 7.7750
Name: Fare, Length: 182, dtype: float64
# 写入代码
sex_fare_survived = pd.merge(task2, task3, on = "Sex")
sex_fare_survived
Fare | Survived | |
---|---|---|
Sex | ||
female | 44.479818 | 233 |
male | 25.523893 | 109 |
sex_fare_survived.to_csv("sex_fare_survived.csv")
# 不同年龄的存活人数
survived_age_num = result["Survived"].groupby(result["Age"]).sum()
survived_age_num
Age
0.42 1
0.67 1
0.75 2
0.83 2
0.92 1
..
70.00 0
70.50 0
71.00 0
74.00 0
80.00 1
Name: Survived, Length: 88, dtype: int64
# 存活人数最多的年龄段
most_survived_age = survived_age_num[survived_age_num.values == survived_age_num.max()].index[0]
most_survived_age
24.0
#存活人数最高的年龄段的存活率
human_sum = result["Survived"].sum()
print("总人数:{}".format(human_sum))
survived_rate = survived_age_num.max()/human_sum
print(f"存活人数最高的年龄段的存活率:{survived_rate}")
总人数:342
存活人数最高的年龄段的存活率:0.043859649122807015