动手学数据分析——Task3:数据重构

本文介绍了使用Pandas进行数据清洗、重构和分析的过程,包括数据合并(concat、merge、join)以及数据聚合运算(groupby)。通过合并不同数据集,分析了泰坦尼克号上男女乘客的平均票价和存活率,揭示了仓位等级与存活率的关系,以及不同年龄层次的存活情况。最后,进行了数据的可视化,以便从不同角度理解数据。
摘要由CSDN通过智能技术生成

复习:在前面我们已经学习了Pandas基础,第二章我们开始进入数据分析的业务部分,在第二章第一节的内容中,我们学习了数据的清洗,这一部分十分重要,只有数据变得相对干净,我们之后对数据的分析才可以更有力。而这一节,我们要做的是数据重构,数据重构依旧属于数据理解(准备)的范围。

开始之前,导入numpy、pandas包和数据

import numpy as np
import pandas as pd
text = pd.read_csv(r'C:\Users\Administrator\六月组队学习\hands-on-data-analysis-master\第二章项目集合\data\train-left-up.csv')
text.head()

在这里插入图片描述
第二章:数据重构1
2.4 数据的合并
2.4.1 任务一:将data文件夹里面的所有数据都载入,观察数据的之间的关系

text_left_up = pd.read_csv("data/train-left-up.csv")
text_left_down = pd.read_csv("data/train-left-down.csv")
text_right_up = pd.read_csv("data/train-right-up.csv")
text_right_down = pd.read_csv("data/train-right-down.csv")

以一个为例

text_left_up.head()
text_left_up.shape

在这里插入图片描述(439, 4)
【提示】结合之前我们加载的train.csv数据,大致预测一下上面的数据是什么

【回答】通过df.shape()函数,我们可以看出原本的dataframe被从第439行以下第4列以右切分成四个小的dataframe.
2.4.2:任务二:使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up

list_up = [text_left_up,text_right_up] # 两个dataframe放到一张list里面
result_up = pd.concat(list_up,axis=1) # concat的对象要是list,把list里面的元素合并,axis=1表示在垂直方向进行连接
result_up.head()
type(result_up)
result_up.shape

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

list_down=[text_left_down,text_right_down]
result_down = pd.concat(list_down,axis=1)
result_down.head()
result_down.to_csv('result_down.csv') 

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

resul_up = text_left_up.join(text_right_up)
result_down = text_left_down.join(text_right_down)
result = result_up.append(result_down)
result.head()
type(result)
result.shape

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

result_up = pd.merge(text_left_up,text_right_up,left_index=True,right_index=True) # 使用左侧与右侧dataframe的行索引作为连接键
result_down = pd.merge(text_left_down,text_right_down,left_index=True,right_index=True)
result = resul_up.append(result_down)
result.head()
type(result)
result.shape

【思考】对比merge、join以及concat的方法的不同以及相同。思考一下在任务四和任务五的情况下,为什么都要求使用DataFrame的append方法,如何只要求使用merge或者join可不可以完成任务四和任务五呢?
merge、join以及cocat都能进行横向操作。
concat通过设置axis=1还可以进行纵向操作。merge和concat是pandas的方法,join是DataFrame的方法。
任务四和任务五因为分别用merge和join只进行了横向操作,没进行纵向操作,而append可以进行纵向操作。如果只使用merge和join应该也能完成任务四和任务五,还在尝试。
参考链接:https://blog.csdn.net/milton2017/article/details/544064
2.4.6 任务六:完成的数据保存为result.csv

result.to_csv('result.csv')

2.5 换一种角度看数据
2.5.1 任务一:将我们的数据变为Series类型的数据

# 将完整的数据加载出来
text = pd.read_csv('result.csv')
text.head()
unit_result=text.stack().head(20)
unit_result
unit_result.shape
type(unit_result)
0  Unnamed: 0                                                     0
   PassengerId                                                    1
   Survived                                                       0
   Pclass                                                         3
   Name                                     Braund, Mr. Owen Harris
   Sex                                                         male
   Age                                                           22
   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
   SibSp                                                          1
dtype: object






(20,)






pandas.core.series.Series

stack: 将数据从DataFrame变成层次化的Series,即将其列索引变成行索引

#将代码保存为unit_result,csv
unit_result.to_csv('unit_result.csv')
test.head()

在这里插入图片描述第二章:数据重构2
第一部分:数据聚合与运算
2.6 数据运用
2.6.1 任务一:通过《Python for Data Analysis》P303、Google or Baidu来学习了解GroupBy机制
心得:python中groupby函数主要的作用是灵活的组合多个属性,进行数据的分组以及分组后地组内运算。
对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下:
df.groupby([df[属性],df[属性])(指分类的属性,数据的限定定语,可以有多个).mean()(对于数据的计算方式——函数名称)
2.4.2:任务二:计算泰坦尼克号男性与女性的平均票价

df =text['Fare'].groupby(text['Sex'])
means =df.mean()
means
Sex
0    25.523893
1    44.479818
Name: Fare, dtype: float64

分析:女性的平均票价比男性的高不少,猜测男性劳工数更多
2.4.3:任务三:统计泰坦尼克号中男女的存活人数

survived_sex=text['Survived'].groupby(text['Sex'])
sums=survived_sex.sum()
sums.head()

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

suvived_pclass=text['Survived'].groupby(text['Pclass'])
suvived_pclass.sum()

各个舱位等级的存活率

text['Pclass'].value_counts(sort=False)
rate_suvived_pclass=suvived_pclass.sum()/text['Pclass'].value_counts(sort=False)
rate_suvived_pclass
1    216
2    184
3    491
Name: Pclass, dtype: int64






Pclass
1    0.629630
2    0.472826
3    0.242363
dtype: float64

结论:1、我们得到了各个仓位等级的存活率,可以看出一等舱存活率达到约0.63,二等舱存活率约0.47,三等舱存活率约0.24,说明仓位等级越高,存活率越高
2、 女人的平均票价更高,推测总体而言,女人的地位相对男性要高;女性的存活情况远高于男性,推测逃生时女性优先;
2.4.5:任务五:统计在不同等级的票中的不同年龄的船票花费的平均值

text.groupby(['Pclass','Age'])['Fare'].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

2.4.6:任务六:将任务二和任务三的数据合并,并保存到sex_fare_survived.csv

result = pd.merge(means,survived_sex,on='Sex')
result

在这里插入图片描述

result.to_csv('sex_fare_survived.csv')

2.4.7:任务七:得出不同年龄的总的存活人数,然后找出存活人数的最高的年龄,最后计算存活人数最高的存活率(存活人数/总人数)

#不同年龄的存活人数
survived_age = text['Survived'].groupby(text['Age']).sum()
survived_age
Age
0.42     1
0.67     1
0.75     2
0.83     2
0.92     1
        ..
70.00    0
70.50    0
71.00    0
74.00    0
80.00    1
Name: Survived, Length: 88, dtype: int64
#找出最大值的年龄段
survived_age[survived_age.values==survived_age.max()]
Age
24.0    15
Name: Survived, dtype: int64
_sum = text['Survived'].sum()
print(_sum)
342
print("sum of person:"+str(_sum))

precent =survived_age.max()/_sum

print("最大存活率:"+str(precent))
sum of person:342
最大存活率:0.043859649122807015
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值