Task03 数据重构

这一节的任务为数据重构,它仍然是对数据的理解

1 数据合并

在python中,有三个函数可以将数据合并,分别是concat、join和merge、join,接下来将介绍这三个函数的用法。
1、pd.concat
pd.concat(objs, axis=0, join=‘outer’, join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False)
常用参数说明:
objs:需要合并的数据集,可以是series或dataframe构成的list。
axis=0:默认为根据行来合并,当axis=1时,是以列为轴来合并。
join=’outer‘:默认为外连接(数据的并集),当join=’inner‘时,是内连接(数据的交集)。
join_axes=None:该参数用于指定根据哪个轴来对齐数据。
ignore_index:当该参数为True时,两个表会根据列字段对齐,最后重新赋予一个index。

2、join
dataframe.join(other, on=None, how=‘left’, lsuffix=’’, rsuffix=’’, sort=False)
常用参数说明:
other:dataframe、series或dataframe组成的list形式。
on=None:用于指定依据哪一列合并,默认为依据index合并。
how=’left‘:数据合并的方式,默认数据为左连接,how的其他选项为’right‘、’outer‘、’inner‘。
lsuffix=’’:字符串,将左侧数据框的重复列重新命名为“原始列名+该字符串”。
rsuffix=’’:字符串,将右侧数据框的重复列重新命名为“原始列名+该字符串”。
sort=False:sort默认为False,当其为True时,连接键则按顺序排列。

3、pd.merge
pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None,left_index=False,
right_index=False,sort=False,suffixes=(’_x’, ‘_y’), copy=True,
indicator=False,validate=None)
常用参数说明:
left:一个dataframe。
right:需要合并的对象,也是dataframe。
how=‘inner’:数据合并的方式,默认为inner,其他选项:‘left’, ‘right’, ‘outer’。
on=None:要连接的列或索引,必须同时存在于两个dataframe中,未指定则默认为列名的交集。
left_on=None,right_on=None:左、右侧DataFarme中用作连接键的列。
left_index=False, right_index=False:将左、右侧的行索引用作其连接键。

三者的特点总结
concat:可用于纵向或横向拼接,默认为纵向拼接(即行拼接),连接方式只有内连接和外连接。
merge:可用于纵向或横向拼接,默认为横向拼接,how=’outer‘可实现纵向拼接。连接方式有内、外、左、右连接。
join:只可用于横向拼接,连接方式有内、外、左、右连接。可继续用append实现纵向拼接。

以下以泰坦尼克号数据为例展示这三个函数的用法:

import numpy as np
import pandas as pd
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
#数据的载入
train_left_up=pd.read_csv("./data/train-left-up.csv")
train_left_up.head()
train_left_down=pd.read_csv("./data/train-left-down.csv")
train_left_down.head()
train_right_down=pd.read_csv("./data/train-right-down.csv")
train_right_down.head()
train_right_up=pd.read_csv("./data/train-right-up.csv")
train_right_up.head()

Task03 数据重构

Task03 数据重构

可以明显看出的是,这四个数据集是将训练集分为了四部分,分为了左上、左下、右上、右下四个部分。

#使用concat方法将数据集合并
result_up=pd.concat([train_left_up,train_right_up],axis=1)
result_down=pd.concat([train_left_down,train_right_down],axis=1)
result=pd.concat([result_up,result_down])

#使用join和append的方法将数据集合并
result_up=train_left_up.join(train_right_up)
result_down=train_left_down.join(train_right_down)
result=result_up.append(result_down)

#使用merge和append的方法将数据集合并
result_up=pd.merge(train_left_up,train_right_up,left_index=True,right_index=True)
result_down=pd.merge(train_left_down,train_right_down,left_index=True,right_index=True)
result=result_up.append(result_down)

#仅使用merge将数据集合并
result_up=pd.merge(train_left_up,train_right_up,left_index=True,right_index=True)
result_down=pd.merge(train_left_down,train_right_down,left_index=True,right_index=True)
result=pd.merge(result_up,result_down,how='outer')

result

Task03 数据重构

最后合并完的数据集是一个891行,12列的数据集,这与我们之前所见的训练集的大小相同。

2 将数据变为Series类型的数据

使用stack函数能将dataframe转换成series的形式,便于我们以低维度形式处理高维度数据。

result.stack().head(25)

Task03 数据重构

可以看到结果是经过美化的带有MultilIndex索引的Series的格式。

3 数据聚合与运算

此小节通过groupby函数来对数据进行聚合与运算。
groupby函数简单介绍:
groupby可以对数据进行分组,并对分组后的数据应用函数进行运算。
·groupby的实现方式有两种:
1、df.groupby(‘key2’)[‘key1’]
2、df[‘key1’].groupby(df[‘key2’])
上述代码表示df中key1列按照key2来分组。
·groupby可直接对分组后的函数进行运算(以求均值为例):
1、df.groupby(‘key2’)[‘key1’].mean()
2、df[‘key1’].groupby(df[‘key2’]).mean()

接下来以几个实例展示groupby的用法。

#1、计算泰坦尼克号男性与女性的平均票价
sex_fare=result['Fare'].groupby(result['Sex']).mean()
sex_fare

结果:
Sex
female 44.479818
male 25.523893
Name: Fare, dtype: float64

#2、统计泰坦尼克号中男女的存活人数
sex_survived=result['Survived'].groupby(result['Sex']).sum()
sex_survived

结果:
Sex
female 233
male 109
Name: Survived, dtype: int64

#3、计算客舱不同等级的存活人数
Pclass_survived=result['Survived'].groupby(result['Pclass']).sum()
Pclass_survived

结果:
Pclass
1 136
2 87
3 119
Name: Survived, dtype: int64

其中,任务1和2还可以使用agg函数同时实现

result.groupby('Sex').agg({'Fare':'mean','Survived':'sum'}).rename(columns=
                            {'Fare': 'fare_mean', 'Survived': 'survived_count'})

结果:

Task03 数据重构

从上述结果可以得到:女性的平均船价为44.48,且女性的存活人数为233个;男性的平均船价为25.52,且男性的存活个数为109个。

#4、统计在不同等级的票中的不同年龄的船票花费的平均值
result['Fare'].groupby([result['Pclass'],result['Age']]).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

#5、
#得出不同年龄的总的存活人数,然后找出存活人数的最高的年龄,最后计算存活人数最高的存活率
age_survived=result['Survived'].groupby(result['Age']).sum()
age_survived[age_survived.values==age_survived.max()]

people_survived=result['Survived'].sum()
survived_max=age_survived.max()/people_survived
survived_max
#

结果:
Age
24.0 15
Name: Survived, dtype: int64

0.043859649122807015

存活人数最高的年龄为24岁,共有15人存活。该年龄的存活率为4.39%。

上一篇:DataWhale 动手学数据分析 Task03 数据重构


下一篇:数据分析_task3