动手学数据分析 TASK3 数据重构

本篇是用于记录第二章的第二小节,旨在实现数据重构,通过对数据整体的结构的变换调整、以达到分析不同层次、群体画像数据的目的。主要包括数据的合并和数据的属性方面聚合运算groupby等用法。

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

#导入基本库
import numpy as np
import pandas as pd

第二节 数据重构

数据的合并

2.4.1 载入数据观察数据间关系
left_up = pd.read_csv("data/train-left-up.csv")
left_down = pd.read_csv("data/train-left-down.csv")
right_up = pd.read_csv("data/train-right-up.csv")
right_down = pd.read_csv("data/train-right-down.csv")

观察数据可以发现各分数据分别代表原数据train.csv的左上,左下,右上、右下部分

2.4.2 使用concat方法 (axis=1表示横向列合并,默认即为纵向合并)
#横向合并
将数据train-left-up.csv和train-right-up.csv横向合并为一张表
>>>result_up = pd.concat([left_up,right_up],axis = 1) 

将train-left-down和train-right-down横向合并为一张表
>>>result_down = pd.concat([left_down,right_down],axis = 1)

将上边的result_up和result_down纵向合并为result
>>>result = pd.concat([result_up,result_down])
>>>result.shape
(891,12)
2.4.3 使用DataFrame自带的方法join方法和append方法
#join:列横向合并  append:行纵向合并
up = left_up.join(right_up)
down = left_up.join(right_up)
result1 = up.append(down)
2.4.4 使用Pandas的merge方法和DataFrame的append方法
#merge本质上也是横向合并列,合并时需要有共同的列
up = pd.merge(left_up,rigth_up,left_index=True,right_index=True)
up.head()

在这里插入图片描述

>>>down=pd.merge(left_down,right_down,left_index = True,right_index = True)
>>>result2 = up.append(down)
>>>result2.shape
(891,12)

【总结】以上函数用法:

  • merge()和join()是横向拼接
  • concat()轴向连接,可以通过指定axis来改变拼接方向
  • append()是向dataframe对象中添加新的行,如果添加的列名不在dataframe对象中,将会被当作新的列进行添加

2.5 数据类型变换

2.5.1 将数据变成Series类型数据
#读取数据
data = pd.read_csv('result.csv')
data.head()

使用stack函数进行变换,转为Serie类型

参考博文讲到stack()的具体用法

  • stack()函数:将Dataframe数据变为Series类型的数据
  • stack即为堆叠,该函数即为实现输入数个数组不同方式的堆叠,返回堆叠后的1个数组。
  • 参数:
    • arrays:用来作为堆叠的数个形状维度相等的数组
    • axis:即指定依照哪个维度进行堆叠,也就是指定哪种方式进行堆叠数组,默认axis=0(行)
  • 输出:堆叠后的1个数组
>>>data_unit = data.stack()
>>>data_unit.head()
0  Unnamed: 0                           0
   PassengerId                          1
   Survived                             0
   Pclass                               3
   Name           Braund, Mr. Owen Harris
dtype: object

2.6 数据聚合与运算

2.6.1 Groupby机制

Groupby主要用于数据聚合和分类计算,其思想是‘split-apply-combine’(拆分-应用-合并)
给出参考链接:
图解Pandas的groupby机制
超好用的 pandas 之 groupby

联想到SQL中也常用的groupby  [SQL数据分析之 group by 的实现原理](https://zhuanlan.zhihu.com/p/86613661)
#以list形式查看分性别数据
>>>list(df.groupby('Sex'))[1]   男性
('male',      Unnamed: 0  PassengerId  Survived  Pclass  \
 0             0            1         0       3   
 4             4            5         0       3   
 5             5            6         0       3   
 6             6            7         0       1   
 7             7            8         0       3   
 12           12           13         0       3   
 13           13           14         0       3   
 16           16           17         0       3   
 17           17           18         1       2   
 ......   

>>>list(df.groupby('Sex'))[0]   女性
('female',      Unnamed: 0  PassengerId  Survived  Pclass  \
 1             1            2         1       1   
 2             2            3         1       3   
 3             3            4         1       1   
 8             8            9         1       3   
 9             9           10         1       2   
 10           10           11         1       3   
 11           11           12         1       1   
 14           14           15         0       3   
......

#对按性别分的数据进行描述统计分析
group = df.groupby('Sex')
group.describe()

在这里插入图片描述

按性别分析年龄变量
df.groupby('Sex')['Age'].describe()

在这里插入图片描述

2.6.2 计算泰坦尼克号男性与女性的平均票价
>>>df.groupyb('Sex')['Fare'].mean()
Sex
female    44.479818
male      25.523893
Name: Fare, dtype: float64

mean_fare_sex = df.groupby('Sex')['Fare'].mean()
2.6.3 统计泰坦尼克号中的男女存活人数

【提示】:表中的存活那一栏,可以发现如果还活着记为1,死亡记为0,因而计算存活人数即将数值加总即可

>>>df.groupby('Sex')['Survived'].sum()
Sex
female    233
male      109
Name: Survived, dtype: int64
>>>survived_sex = df.groupby('Sex')['Survived'].sum()
2.6.4 计算客舱不同等级的存活人数
>>>df.groupby('Pclass')['Survived'].sum()
Pclass
1    136
2     87
3    119
Name: Survived, dtype: int64
或
>>>df.groupby('Pclass')['Survived'].agg('sum')  
#agg函数在功能上可以同时列举出多个条件
Pclass
1    136
2     87
3    119
Name: Survived, dtype: int64

【思考】从数据分析的角度来分析上述统计结果

  1. 泰坦尼克号的票价男性与女性的平均票女性较男性高;
  2. 泰坦尼克号女性的存活人数多余男性;
  3. 客舱不同等级的存活人数的排序为等级1>等级3>等级2。

【思考】上述第二第三小节中的运算可以通过agg()函数来同时计算。并且可以使用rename函数修改列名

#按性别来分 对存活人数求和,对票价求平均
df.groupby('Sex').agg({'Survived':'sum','Fare':'mean'}).rename(
    columns = {'Survived':'Survived_sum','Fare':'Fare_mean'}) 

在这里插入图片描述

2.6.5 统计在不同等级的票中的不同年龄的船票花费的平均值

拆解开来“不同等级”+“不同年龄”——船票花费平均值

>>> df.groupby(['Pclass','Age'])['Fare'].mean().head(4)
Pclass  Age  
1       0.92     151.5500
        2.00     151.5500
        4.00      81.8583
        11.00    120.0000
Name: Fare, dtype: float64
2.6.6 将任务二和任务三的数据合并,并保存到sex_fare_survived.csv
# 查看两份数据的索引属性
>>>mean_fare_sex.index
Index(['female', 'male'], dtype='object', name='Sex')
>>>survived_sex.index
Index(['female', 'male'], dtype='object', name='Sex')
#可以看到上面的两数据的index相同,故可以用merge函数

# 查看两份数据的类型
>>>type(mean_fare_sex)
pandas.core.series.Series  
>>>type(survived_sex)
pandas.core.series.Series  

#两份数据均为Series类型需要对数据进行转换
mean_fare_sex = mean_fare_sex.to_frame()
survived_sex = survived_sex.to_frame()

#用merge函数完成横向合并
pd.merge(mean_fare_sex,survived_sex,on = 'Sex')

在这里插入图片描述

2.6.7 得出不同年龄的总的存活人数,然后找出存活人数的最高的年龄,最后计算存活人数最高的存活率(存活人数/总人数)
# 得出不同年龄的总的存活人数
>>>df.groupby('Age')['Survived'].sum().head(8)
Age
0.42    1
0.67    1
0.75    2
0.83    2
0.92    1
1.00    5
2.00    3
3.00    5
Name: Survived, dtype: int64

survived_age = df.groupby('Age')['Survived'].sum()

>>>survived_age.values  #查看值
array([ 1,  1,  2,  2,  1,  5,  3,  5,  7,  4,  2,  1,  2,  2,  0,  1,  1,
        2,  3,  0,  4,  6,  6,  9,  9,  3,  0,  5, 11,  5,  0, 15,  0,  6,
        6, 11,  7,  0,  8, 10,  0,  8,  9,  1,  6,  6,  0, 11, 11,  0,  1,
        5,  5,  6,  0,  2,  6,  1,  3,  5,  0,  0,  1,  6,  4,  5,  2,  3,
        1,  3,  1,  0,  2,  0,  3,  0,  2,  0,  2,  2,  0,  0,  0,  0,  0,
        0,  0,  1], dtype=int64)

#找出存活人数的最高的年龄的位置
>>>survived_age.values == max(survived_age)
array([False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False,  True, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False])

#得到存活人数的最高的年龄
>>> survived_age[survived_age.values == max(survived_age)]
Age
24.0    15
Name: Survived, dtype: int64

# 存活总人数(即Survived列所有值加总)
>>>sum(df['Survived'])
342

#计算存活人数最高的存活率
>>>rate = max(survived_age) / sum(df['Survived'])
>>>rate

# 为了更直观地展现,我们用以下命令
>>>'最大存活率:{}'.format(rate)
'最大存活率:0.043859649122807015'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值