目录
5.1.1 任务一:将data文件夹里面的所有数据都载入,观察数据的之间的关系
5.1.2 任务二:使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
5.1.4 任务四:使用DataFrame自带的方法join方法和append:完成任务二和任务三的任务
5.1.5 任务五:使用Panads的merge方法和DataFrame的append方法:完成任务二和任务三的任务
5.3.1 任务一:通过《Python for Data Analysis》P303、Google or Baidu来学习了解GroupBy机制
5.3.5 任务五:统计在不同等级的票中的不同年龄的船票花费的平均值
5.3.6 任务六:将任务二和任务三的数据合并,并保存到sex_fare_survived.csv
5.3.7 任务七:得出不同年龄的总的存活人数,然后找出存活人数最多的年龄段,最后计算存活人数最高的存活率(存活人数/总人数)
5、数据重构
5.1数据的合并
5.1.1 任务一:将data文件夹里面的所有数据都载入,观察数据的之间的关系
--经观察,四张表是把原train.csv中数据按象限分为4个部分,接下来需要对四张表进行不同方式的连接
--表的连接可调用函数:merge(),join(),concat()
--merge():类似关系数据库的连接方式,根据同一主键将不同表连接
merge(left, right, how='inner', on=None,
left_on=None, right_on=None,
left_index=False, right_index=False,
sort=True,suffixes=('_x', '_y'), copy=True, indicator=False)
--left与right:两个不同的DataFrame
--how:合并(连接)的方式,有inner(内连接),left(左外连接),right(右外连接),outer(全外连接),默认为inner
--on : 用于连接的列索引名称。必须存在左右两个DataFrame对象中,如果没有指定且其他参数也未指定,则以两个DataFrame的列名交集做为连接键
--left_on:左则DataFrame中用作连接键的列名
--right_on:右则DataFrame中用作连接键的列名
--left_index:使用左则DataFrame中的行索引做为连接键
--right_index:使用右则DataFrame中的行索引做为连接键
--sort:默认为True,将合并的数据进行排序。
--suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时,在列名后面附加的后缀名称,默认为('_x','_y')
--copy:默认为True,总是将数据复制到数据结构中
--indicator:显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)
--join():类似merge,不过默认左连接(how=left)
--concat():类似数据库中全连接,可指定连接方式和轴向(列或者行连接)
--concat()会保留重复项,要删除可用drop_duplicates()
5.1.2 任务二:使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
result_up = pd.concat([train_left_up, train_right_up], axis=1)
# axis=1两表横向连接,=0纵向连接
5.1.3 任务三:使用concat方法:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。然后将上边的result_up和result_down纵向合并为result
result_down = pd.concat([train_left_down,train_right_down], axis=1)
# 四张表合并成result表
result = pd.concat([result_up, result_down], axis=0)
5.1.4 任务四:使用DataFrame自带的方法join方法和append:完成任务二和任务三的任务
--append():
result_left = np.append(train_left_up, train_left_down, axis=0)
title_left = ['PassengerId', 'Survived', 'Pclass', 'Name']
# append()合并后生成array数据,需要转换
result_left = pd.DataFrame(result_left, columns=title_left)
result_left
--注意:
①append()生成array数据,需要转换成dataframe
result_right = train_right_up.append(train_right_down)
result_right
# out
array([[1, 0, 3, 'Braund, Mr. Owen Harris'],
[2, 1, 1, 'Cumings, Mrs. John Bradley (Florence Briggs Thayer)'],
[3, 1, 3, 'Heikkinen, Miss. Laina'],
...,
[889, 0, 3, 'Johnston, Miss. Catherine Helen "Carrie"'],
[890, 1, 1, 'Behr, Mr. Karl Howell'],
[891, 0, 3, 'Dooley, Mr. Patrick']], dtype=object)
②append()可以直接将两表拼接,但会报警告(官方会去除该拼接功能,故今后最好用concat)
--join()与append()结合使用:
# join()只能实现行连接
result_left = train_left_up.join(train_right_up)
result_right = train_left_down.join(train_right_down)
# 将左右表连接,默认列连接
result = result_left.append(result_right)
# 重置并删除原索引列,以o-n作为新索引并添加到现有dataframe中
result.reset_index(drop=True, inplace=True)
result
--注意:
①join只能实现行连接
②append拼接后,新dataframe的索引列需要重置reset_index()
--drop=true:删除原索引(默认false)
--inplace=true:对原数据修改(默认false)
5.1.5 任务五:使用Panads的merge方法和DataFrame的append方法:完成任务二和任务三的任务
result_up = pd.merge(train_left_up, train_right_up, on='origin_key', how='inner')
result_down = pd.merge(train_left_down, train_right_down, on='origin_key', how='inner')
result = result_up.append(result_down)
result.reset_index(drop=True, inplace=True)
result
5.1.6 任务六:完成的数据保存为result.csv
思考:merge()与join()连接方法类似,后者默认左连接,并且这两个方法都需要结合append()使用(用于列连接),今后python官方将会用cooncat()替代append(),故以后列表的合并就使用concat()
5.2换种角度看数据
5.2.1 任务一:将我们的数据变为Series类型的数据
--datafrme为二维表的数组,可拆分成多个series,便于分析
--拆分方法:
--iloc[]:基于行列索引选取序列(【行起:行尾,列起:列尾】)
train_Name_se = titanic_train.iloc[:, 3] # 提取从起始到结束位置的第三列数据
# 等价于train_ticket_se = titanic_train['Ticket'].squeeze()
print(train_Name_se, type(train_Name_se)) # type()查看数据类型
--squeeze():
--语法:np.squeeze(a, axis=None)
--作用:删除单维度条目(由于在深度学习算法中,无法对数组作图,故常用于squeeze压缩维度后再作图)
train_three_row = titanic_train.iloc[3].reset_index(drop=True).squeeze()
# 取出第三行的数据并转换成series()
# 注意squeeze()起到降维度作用,当存在1维度以上数据使用(即此处可不用)
print(train_three_row, type(train_three_row))
--stack():堆栈——原数组的行索引不变,列索引及相对应的数据进行旋转,以行的形式结合列索引变成层次化索引
data_stack_explain = pd.read_csv('result.csv')
# 将dataframe数据拆分堆栈(列不变,转换各行索引下的数据为列,即变为层次化索引)
unit_result = data_stack_explain.stack()
unit_result.head(20)
# out
0 Unnamed: 0 0
PassengerId 1
Survived 0
Pclass 3
Name Braund, Mr. Owen Harris
Sex male
Age 22.0
SibSp 1
Parch 0
Ticket A/5 21171
Fare 7.25
Embarked S
1 Unnamed: 0 1
PassengerId 2
Survived 1
Pclass 1
Name Cumings, Mrs. John Bradley (Florence Briggs Th...
Sex female
Age 38.0
SibSp 1
dtype: object
unit_result.to_csv('unit_result.csv')
data = pd.read_csv('unit_result.csv')
data
# out
Unnamed: 0 Unnamed: 1 0
0 0 Unnamed: 0 0
1 0 PassengerId 1
2 0 Survived 0
3 0 Pclass 3
4 0 Name Braund, Mr. Owen Harris
... ... ... ...
10712 890 SibSp 0
10713 890 Parch 0
10714 890 Ticket 370376
10715 890 Fare 7.75
10716 890 Embarked Q
10717 rows × 3 columns
5.3数据的聚合与运算
5.3.1 任务一:通过《Python for Data Analysis》P303、Google or Baidu来学习了解GroupBy机制
--groupby即将函数运用于pandas对象,对各分组计算返回值,并将返回值分组合并到结果对象
5.3.2 任务二:计算泰坦尼克号男性与女性的平均票价
data_grouped = use_data['Fare'].groupby(use_data['Sex']) # 按性别对票价分组
average_fare = data_grouped.mean() # 对各组数据求平均,并返回
average_fare
--注意:groupby后的数据仅分组,视作中间数据,后续的函数操作并返回值才算一个完整的groupby
5.3.3 任务三:统计泰坦尼克号中男女的存活人数
survived_sex = use_data['Survived'].groupby(use_data['Sex']).sum()
survived_sex
--注意:分组以后,函数对每个组调用,由于survived中的数值用0与1表示,且1代表或者,故求和即得存活人数
5.3.4 任务四:计算客舱不同等级的存活人数
rank_cabin_survived = use_data['Survived'].groupby(use_data['Pclass']).sum()
rank_cabin_survived
--通过以上分析,可以得知:
--①男性购票均价低于女性购票均价
--②女性存活数高于男性,
--③一等舱的存活数最高,三等舱的存活数次之,二等舱存活数最少
--注:要明确三个现象背后的原因需进一步分析,如结合各等级舱位人数分析是否舱位越高,越有可能存活
--任务二与三可以用agg()完成:
--agg():支持对每个分组应用函数
# 语法
DataFrame.agg(function, axis=0)
use_data.groupby('Sex').agg({'Fare': 'mean', 'Survived': 'sum'}).rename(columns=
{'Fare': 'mean_fare', 'Survived': 'sum_sex'})
# 分男女,对票价求平均、统计存活人数
5.3.5 任务五:统计在不同等级的票中的不同年龄的船票花费的平均值
use_data.groupby(['Pclass', 'Age'])[['Fare']].mean()
5.3.6 任务六:将任务二和任务三的数据合并,并保存到sex_fare_survived.csv
sex_fare_survived = pd.merge(average_fare, survived_sex, on='Sex')
# 等价于sex_fare_survived = pd.concat([average_fare, survived_sex], axis=1)
sex_fare_survived.to_csv('sex_fare_survived.csv')
sex_fare_survived
# out
Fare Survived
Sex
female 44.479818 233
male 25.523893 109
5.3.7 任务七:得出不同年龄的总的存活人数,然后找出存活人数最多的年龄段,最后计算存活人数最高的存活率(存活人数/总人数)
# 计算各个年龄存活人数
survived_age = use_data['Survived'].groupby(use_data['Age']).sum()
# 找出存活人数最多年龄
survived_age[survived_age.values == survived_age.max()]
# 找出总存活数
_sum = use_data['Survived'].sum()
# 找出不同年龄中最多存活数
age_survived = survived_age.max()
# 求存活率
print("最大存活率=", age_survived / _sum)