一起动手学数据分析 task03 数据重构

第二章第二节第三节学习目录

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)

最终输出是一样的:
在这里插入图片描述

【总结】

在此次学习中,我们可以知道并且学习到如何进行数据的重构和表的合并分组等等,当然最后还有一些函数数值的计算方式的学习。让我们更加深入的了解到如何分解数据来进行数据分析,最后得到我们想要的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值