第二章 数据重构
导入基本库
import numpy as np
import pandas as pd
载入data文件中的train-left-up.csv文件
train_left_up = pd.read_csv(r'F:\data_analyse\hands-on-data-analysis\第二章项目集合\data\train-left-up.csv')
train_left_up.head(5)
2.4数据的合并
2.4.1将data文件夹里面的所有数据都载入,观察数据的之间的关系
train_left_down = pd.read_csv(r'F:\data_analyse\hands-on-data-analysis\第二章项目集合\data\train-left-down.csv')
train_right_up = pd.read_csv(r'F:\data_analyse\hands-on-data-analysis\第二章项目集合\data\train-right-up.csv')
train_right_down = pd.read_csv(r'F:\data_analyse\hands-on-data-analysis\第二章项目集合\data\train-right-down.csv')
train_left_down.head(5)
train_right_up.head(5)
与train_csv文件相比较,这几个文件是将train.csv文件按中间行和中间列拆分形成的四个文件。
2.4.2使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up
train_up = [train_left_up,train_right_up]
result_up = pd.concat(train_up,axis=1)
result_up.head(5)
reslut_up.to_csv('result_up.csv',index=False)
2.4.3 使用concat方法:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。然后将上边的result_up和result_down纵向合并为result。
train_down = [train_left_down,train_right_down]
result_down = pd.concat(train_down,axis=1)
result_down.to_csv('result_down.csv',index=False)
result = pd.concat([result_up,reslut_down],axis=0)
result
2.4.4 使用DataFrame自带的方法join方法和append:完成任务二和任务三的任务
join是对两个表进行行索引,列拼接的函数,直接使用df1.join(df2)就可以
append相当于concat函数在axis=0上进行合并
result_up = train_left_up.join(train_right_up)
result_down = train_left_down.join(train_right_down)
result = result_up.append(result_down)
result
2.4.5 使用Panads的merge方法和DataFrame的append方法:完成任务二和任务三的任务
pandas.merge()函数参数说明:
left和right:两个不同的DataFrame或Series
how:连接方式,有inner、left、right、outer,默认为inner
on:用于连接的列索引名称,必须同时存在于左、右两个DataFrame中,默认是以两个DataFrame列名的交集作为连接键,若要实现多键连接,‘on’参数后传入多键列表即可
left_on:左侧DataFrame中用于连接键的列名,这个参数在左右列名不同但代表的含义相同时非常有用;
right_on:右侧DataFrame中用于连接键的列名
left_index:使用左侧DataFrame中的行索引作为连接键( 但是这种情况下最好用JOIN)
right_index:使用右侧DataFrame中的行索引作为连接键( 但是这种情况下最好用JOIN)
sort:默认为False,将合并的数据进行排序,设置为False可以提高性能
suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为(’_x’, ‘_y’)
copy:默认为True,总是将数据复制到数据结构中,设置为False可以提高性能
indicator:显示合并数据中数据的来源情况
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)
result.head(5)
2.4.6 完成的数据保存为result.csv
result.to_csv('result.csv',index=False)
2.5 换一种角度看数据
2.5.1 将我们的数据变为Series类型的数据
#加载result数据
result_data = pd.read_csv('result.csv')
result_data.head(5)
使用stack()函数将DataFrame数据变为Series数据,stack()又叫做堆叠,将DataFrame数据的行索引变为列索引。相当于DataFrame数据的每一行作为一个集合,这一行行中每个特征对应的表头作为Series数据中的索引,特征值表示为Series数据中的值
unit_result = result_data.stack().head(20)
unit_result.head()
unit_result.to_csv('unit_result.csv',index=False)
unit_result = pd.read_csv('unit_result.csv')
unit_result.head(10)
#加载result.csv数据
result_data = pd.read_csv('result.csv')
result_data.head(5)
2.6数据的运用
2.6.1通过教材《Python for Data Analysis》P303、Google or anything来学习了解GroupBy机制
'''
GroupBy的应用包括三个流程:
Splitting: 将数据按需求分组;
Applying: 对每个小组进行函数操作;
Combining: 合并结果。
'''
分组机制
对性别进行分组
sex_group = result_data.groupby('Sex')
sex_group
发现数据不在是DataFrame数据,而是DataFrameGroupBy对象。
对sex_group进行计数可以发现,groupby()将数据按性别分成了两行
sex_group.count()
当你需要去对具体的某一列数据进行分析时,分组机制会起到很好的作用。
2.6.2计算泰坦尼克号男性与女性的平均票价
ticket_data = result_data['Fare'].groupby(result_data['Sex'])
means_data = ticket_data.mean()
means_data
将票价数据通过.groupby(result_data[‘Sex’])将数据按性别分为两类,并通过.mean()函数计算平均值。
2.6.3统计泰坦尼克号中男女的存活人数
survived_Sex = result_data['Survived'].groupby(result_data['Sex'])
survived_data = survived_Sex.sum()
2.6.4计算客舱不同等级的存活人数
survived_pclass = result_data['Survived'].groupby(rsult_data['Pclass'])
survived_pclass.sum()
思考:从数据分析角度可以得出什么结论?
从数据分析中可以看出,女性的平均票价比男性的平均票价高。女性的存活人数高于男性,主要是因为在灾难中男性选择去救助女性乘客。但是从客舱等级中的存活人数可以看出,高等级客舱的存活人数高于低等级的客舱,因此可以说明等级高的客舱存活几率更大。
【思考】从任务二到任务四中,这些运算可以通过agg()函数来同时计算。并且可以使用rename函数修改列名。
agg()函数参数为选择多需要的函数
result_data.groupby('Survived').agg({'Sex': 'mean', 'Pclass': 'count'}).rename(columns=
{'Sex': 'mean_sex', 'Pclass': 'count_pclass'})
2.6.5统计在不同等级的票中的不同年龄的船票花费的平均值
fare = result_data.groupby(['Pclass','Age'])['Fare']
fare.mean()
2.6.6将任务二和任务三的数据合并,并保存到sex_fare_survived.csv
result = pd.merge(means_data,survived_data,on='Sex')
result
result.to_csv('sex_fare_result.csv')
2.6.7得出不同年龄的总的存活人数,然后找出存活人数的最高的年龄,最后计算存活人数最高的存活率(存活人数/总人数)
survived_age = result_data['Survived'].groupby(result_data['Age'])
survived_age = survived_age.sum()
survived_age.head(5)
#找到最大年龄段
survived_age[survived_age.values == survived_age.max()]
#总人数
all_sum = result_data['Survived'].sum()
all_sum
all_sum = result_data['Survived'].sum()
print("总人数:{}".format(all_sum))
precent = survived_age.max() / all_sum
print("最大存活率:{}".format(precent))