复习:在前面我们已经学习了Pandas基础,第二章我们开始进入数据分析的业务部分,在第二章第一节的内容中,我们学习了数据的清洗,这一部分十分重要,只有数据变得相对干净,我们之后对数据的分析才可以更有力。而这一节,我们要做的是数据重构,数据重构依旧属于数据理解(准备)的范围。
开始之前,导入numpy、pandas包和数据
1 2 3
| import numpy as np import pandas as pd
|
1 2 3
| text = pd.read_csv('result.csv') text.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
|
2 第二章:数据重构
第一部分:数据聚合与运算
2.6 数据运用
2.6.1
任务一:通过教材《Python for Data Analysis》P303、Google or
anything来学习了解GroupBy机制
1 2 3 4 5 6 7 8
| ''' GroupBy机制是Pandas中用于数据分组与聚合的核心操作,其本质是遵循"Split-Apply-Combine"模式:
Split:按指定键(列、函数、数组等)将数据分割成多个子集 Apply:对每个子集独立应用聚合函数(如mean/max)、转换函数(如标准化)或过滤操作 Combine:将结果合并为新的数据结构 '''
|
2.4.2:任务二:计算泰坦尼克号男性与女性的平均票价
1 2 3 4 5
| df = text['Fare'].groupby(text['Sex']) print(df.groups) means = df.mean() means
|
{'female': [1, 2, 3, 8, 9, 10, 11, 14, 15, 18, 19, 22, 24, 25, 28, 31, 32, 38, 39, 40, 41, 43, 44, 47, 49, 52, 53, 56, 58, 61, 66, 68, 71, 79, 82, 84, 85, 88, 98, 100, 106, 109, 111, 113, 114, 119, 123, 128, 132, 133, 136, 140, 141, 142, 147, 151, 156, 161, 166, 167, 172, 177, 180, 184, 186, 190, 192, 194, 195, 198, 199, 205, 208, 211, 215, 216, 218, 229, 230, 233, 235, 237, 240, 241, 246, 247, 251, 254, 255, 256, 257, 258, 259, 264, 268, 269, 272, 274, 275, 276, ...], 'male': [0, 4, 5, 6, 7, 12, 13, 16, 17, 20, 21, 23, 26, 27, 29, 30, 33, 34, 35, 36, 37, 42, 45, 46, 48, 50, 51, 54, 55, 57, 59, 60, 62, 63, 64, 65, 67, 69, 70, 72, 73, 74, 75, 76, 77, 78, 80, 81, 83, 86, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 101, 102, 103, 104, 105, 107, 108, 110, 112, 115, 116, 117, 118, 120, 121, 122, 124, 125, 126, 127, 129, 130, 131, 134, 135, 137, 138, 139, 143, 144, 145, 146, 148, 149, 150, 152, 153, 154, 155, ...]}
Sex
female 44.479818
male 25.523893
Name: Fare, dtype: float64
在了解GroupBy机制之后,运用这个机制完成一系列的操作,来达到我们的目的。
下面通过几个任务来熟悉GroupBy机制。
2.4.3:任务三:统计泰坦尼克号中男女的存活人数
1 2 3
| survived_sex = text['Survived'].groupby(text['Sex']).sum() survived_sex.head()
|
Sex
female 233
male 109
Name: Survived, dtype: int64
2.4.4:任务四:计算客舱不同等级的存活人数
1 2 3
| survived_pclass = text['Survived'].groupby(text['Pclass']) survived_pclass.sum()
|
Pclass
1 136
2 87
3 119
Name: Survived, dtype: int64
【提示:】表中的存活那一栏,可以发现如果还活着记为1,死亡记为0
【思考】从数据分析的角度,上面的统计结果可以得出那些结论
【思考】从任务二到任务三中,这些运算可以通过agg()函数来同时计算。并且可以使用rename函数修改列名。你可以按照提示写出这个过程吗?
1 2 3 4 5 6 7
| ''' agg() 函数是 Pandas 中用于对分组后的数据 同时执行多个聚合操作 的核心工具,其全称为 Aggregate(聚合)。它允许你对不同列应用不同的聚合函数,并支持自定义函数,极大提升数据分析效率。 '''
text.groupby('Sex').agg({'Fare': 'mean', 'Pclass': 'count'}).rename(columns= {'Fare': 'mean_fare', 'Pclass': 'count_pclass'})
|
|
|
mean_fare
|
count_pclass
|
|
Sex
|
|
|
|
female
|
44.479818
|
314
|
|
male
|
25.523893
|
577
|
2.4.5:任务五:统计在不同等级的票中的不同年龄的船票花费的平均值
1 2 3 4
| temp=text.groupby(['Pclass','Age'])['Fare'] temp.groups temp.mean().head()
|
Pclass Age
1 0.92 151.5500
2.00 151.5500
4.00 81.8583
11.00 120.0000
14.00 120.0000
Name: Fare, dtype: float64
2.4.6:任务六:将任务二和任务三的数据合并,并保存到sex_fare_survived.csv
1 2 3 4
| result = pd.merge(means,survived_sex,on='Sex') result result.to_csv('sex_fare_survived.csv')
|
2.4.7:任务七:得出不同年龄的总的存活人数,然后找出存活人数最多的年龄段,最后计算存活人数最高的存活率(存活人数/总人数)
1 2 3 4
| survived_age = text['Survived'].groupby(text['Age']).sum() survived_age.head()
|
Age
0.42 1
0.67 1
0.75 2
0.83 2
0.92 1
Name: Survived, dtype: int64
1 2
| survived_age[survived_age.values==survived_age.max()]
|
Age
24.0 15
Name: Survived, dtype: int64
1 2
| _sum = text['Survived'].sum() print(_sum)
|
342
1 2 3 4 5
| print("sum of person:"+str(_sum))
precetn =survived_age.max()/_sum
print("最大存活率:"+str(precetn))
|
sum of person:342
最大存活率:0.043859649122807015