第二章第二节第三节学习目录
- 2.4 数据的合并
- 2.4.1 任务一:将data文件夹里面的所有数据都载入,与之前的原始数据相比,观察他们的之间的关系
- 2.4.2:任务二:使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
- 2.4.3 任务三:使用concat方法:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。然后将上边的result_up和result_down纵向合并为result。
- 2.4.4 任务四:使用DataFrame自带的方法join方法和append:完成任务二和任务三的任务
- 2.4.5 任务五:使用Panads的merge方法和DataFrame的append方法:完成任务二和任务三的任务
- 2.4.6 任务六:完成的数据保存为result.csv
- 2.5 换一种角度看数据
- 数据聚合与运算
- 2.6 数据运用
- 【总结】
2.4 数据的合并
2.4.1 任务一:将data文件夹里面的所有数据都载入,与之前的原始数据相比,观察他们的之间的关系
载入数据:
left_up = pd.read_csv("data/train-left-up.csv")
left_down = pd.read_csv("data/train-left-down.csv")
right_up = pd.read_csv("data/train-right-up.csv")
right_down = pd.read_csv("data/train-right-down.csv")
观察数据:
left_up.head()
left_down.head()
right_up.head()
right_down.head()
发现 根据观察我们可知,四个数据集中的命名分别代表着:
left=>原始表从Name从右到左一直到最左边的一系列特征
right=>原始表从Sex从左到右一直到最右边的一系列特征
up=>原始表前440行
down=>原始表从第441行到最后一行
2.4.2:任务二:使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
#使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表
result_up=pd.concat([left_up,right_up],axis=1)
result_up.head()
我们可以看到这与原始数据集的特征及其顺序都一样了。
2.4.3 任务三:使用concat方法:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。然后将上边的result_up和result_down纵向合并为result。
注意 其中axis参数默认为合并行,设为1则是合并列。
result_down:
result_down = pd.concat([left_down,right_down],axis=1)
result_down.head()
result:
result = pd.concat([result_up,result_down])
result.head()
我们可以看到,这张表与原始的数据集一模一样了,并且行数与列数一模一样。
2.4.4 任务四:使用DataFrame自带的方法join方法和append:完成任务二和任务三的任务
我们可以从官方文档得知,join方法是将列横向合并,append方法是将行纵向合并。
resul_up = left_up.join(right_up)
result_down = left_down.join(right_down)
result = result_up.append(result_down)
result.head()
我们可以从图中得知,这种方法和concat一样,均可以使表进行列的合并和行的合并。
2.4.5 任务五:使用Panads的merge方法和DataFrame的append方法:完成任务二和任务三的任务
注意 注释有说明参数,无里面参数会报错,拼接失败。错误是因为merge需要有一个共同列进行拼接,改两个参数为True,即从列拼接变为行索引拼接。(merge只能将列横向合并)
#left_index与right_index:
result_up = pd.merge(left_up,right_up,left_index=True,right_index=True)
result_down = pd.merge(left_down,right_down,left_index=True,right_index=True)
result = resul_up.append(result_down)
result.head()
结果可知,同样可以进行表的拼接。
2.4.6 任务六:完成的数据保存为result.csv
result.to_csv('result.csv')
2.5 换一种角度看数据
2.5.1 任务一:将我们的数据变为Series类型的数据
stack 函数:栈函数,返回重构数据,将DataFrame数据变为Series类型的数据。
载入数据集:
#stack 函数:栈函数,返回重构数据
data=pd.read_csv('result.csv')
data.head()
data.stack()
我们可以看到数据一行一行进行特征的显示,首先索引为0的,之后以此类推。
保存数据:
unit_result=data.stack()
#将代码保存为unit_result.csv
unit_result.to_csv('unit_result.csv')
数据聚合与运算
2.6 数据运用
载入所需数据集:
df = pd.read_csv('result.csv')
2.6.1 任务一:通过《Python for Data Analysis》P303、Google or Baidu来学习了解GroupBy机制
GroupBy机制:Hadley Wickham创造了用于描述组操作的术语拆分-应用-联合(split-apply-combine),即GroupBy机制。如下是GroupBy主要过程:
1.数据需要是包含在pandas对象中的,可以是Series、DataFrame或其他的各种数据结构;
2.根据任务详情通过一个或多个键分离到各个组中(分离操作是在数据对象的特定轴向上进行的)。
3.函数在各个分组中进行应用,产生新的值
4.所有函数的应用结果最后重新汇总为为一个结果对象。
2.6.2:任务二:计算泰坦尼克号男性与女性的平均票价
首先根据性别进行分组:
#根据性别进行分组
list(df.groupby('Sex'))
其中,list是根据下标进行访问,可以数组下标的方式访问。
group = df.groupby('Sex')
group.describe()
我们可以从上图表中看到数据已经以性别分组进行了信息的统计。
但如果只想知道Age的信息,可以直接进行索引。
#如果只想知道Age的信息,可以直接索引
df.groupby('Sex')['Age'].describe()
计算泰坦尼克号男性与女性的平均票价:
means_sex=df.groupby('Sex')['Fare'].mean()
means_sex
我们可以看出男性平均票价比女性要高,接近两倍。
2.6.3:任务三:统计泰坦尼克号中男女的存活人数
注意 直接利用Survived特征存活记为1,死亡记为0,求和即可得知存活人数。
survived_sex = df.groupby('Sex')['Survived'].sum()
survived_sex
我们可以看到,女性存活的人数远大于男性。
2.6.4:任务四:计算客舱不同等级的存活人数
survived_pclass = df.groupby('Pclass')['Survived'].sum()
survived_pclass
从图中我们可以得知,等级最高的舱位存活率最高,接下来是三等舱,中间舱位的反而存活率最低。
【思考】从任务二到任务三中,这些运算可以通过agg()函数来同时计算。并且可以使用rename函数修改列名。
agg()与如上函数相同,例如:
survived_pclass = df.groupby('Pclass')['Survived'].agg('sum')
survived_pclass
从图中可知结果与任务中使用方法所产生的结果相同。
但agg()可以同时计算多个特征参数。
思考题做法如下(计算多个特征值并改列名):
df.groupby('Sex').agg({'Survived': 'sum','Fare': 'mean' }).rename(columns={ 'Survived': 'sum_survived','Fare': 'mean_fare'})
2.6.5:任务五:统计在不同等级的票中的不同年龄的船票花费的平均值
df.groupby(['Pclass','Age'])['Fare'].mean()
我们可以从图中看出,根据分组时的编写顺序,先从舱位开始分组,再在同一等级舱位中对年龄进行分组,最终进行平均花费的计算。
2.6.6:任务六:将任务二和任务三的数据合并,并保存到sex_fare_survived.csv
我们先来判断一下数据是否可以合并:
对索引进行判断,发现两者的索引都是男女性别,所以 可以进行合并。
但需要对两个任务的数据进行转换,因为他们都是series类型的,不能用merge进行合并。
转换:
means_sex=means_sex.to_frame()
survived_sex=survived_sex.to_frame()
合并(并改列名):
result = pd.merge(means_sex,survived_sex,on='Sex').rename(columns={ 'Survived': 'sum_survived','Fare': 'mean_fare'})
result
我们可以看到,这一任务下的结果与任务四的思考题结果相同,也就是说这是用两种函数实现agg()函数。
保存:
result.to_csv('sex_fare_survived.csv')
2.6.7:任务七:得出不同年龄的总的存活人数,然后找出存活人数最多的年龄段,最后计算存活人数最高的存活率(存活人数/总人数)
1.不同年龄的总存活人数:
#不同年龄的存活人数
survived_age = df.groupby('Age')['Survived'].sum()
survived_age.head()
2.存活人数最多的年龄段(注意注释内容):
survived_age[survived_age.values==max(survived_age)]
#max函数也可以这样用:survived_age[survived_age.values==survived_age.max()]
我们可由此得知,年龄24岁的人存活的人中人数最多。
3.计算存活人数最高的存活率(存活人数/总人数):
person_sum = df['Survived'].sum()
survived_age.max()/person_sum
如图可得,计算存活人数最高的存活率计算结果为0.043859649122807015,在所有人,就算是存活率最高的年龄段中,也仅仅只有大约5%的24岁的人在这次事故中幸存了下来。
这样输出看起来不直观,我们可以用format()函数进行一下格式化:
第一种方式:
rate=survived_age.max()/person_sum
'最大存活率:{}'.format(rate)
第二种方式:
rate=survived_age.max()/person_sum
'最大存活率:'+str(rate)
最终输出是一样的:
【总结】
在此次学习中,我们可以知道并且学习到如何进行数据的重构和表的合并分组等等,当然最后还有一些函数数值的计算方式的学习。让我们更加深入的了解到如何分解数据来进行数据分析,最后得到我们想要的结果。