数分项目《泰坦尼克》——Task3

目录

5、数据重构

5.1数据的合并

5.1.1 任务一:将data文件夹里面的所有数据都载入,观察数据的之间的关系

5.1.2 任务二:使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up

5.1.3 任务三:使用concat方法:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。然后将上边的result_up和result_down纵向合并为result

5.1.4 任务四:使用DataFrame自带的方法join方法和append:完成任务二和任务三的任务

5.1.5 任务五:使用Panads的merge方法和DataFrame的append方法:完成任务二和任务三的任务

5.1.6 任务六:完成的数据保存为result.csv

5.2换种角度看数据

5.2.1 任务一:将我们的数据变为Series类型的数据

5.3数据的聚合与运算

5.3.1 任务一:通过《Python for Data Analysis》P303、Google or Baidu来学习了解GroupBy机制

5.3.2 任务二:计算泰坦尼克号男性与女性的平均票价

5.3.3 任务三:统计泰坦尼克号中男女的存活人数

5.3.4 任务四:计算客舱不同等级的存活人数

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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值