数据重构

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


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

#导入基本库

import numpy as np

import pandas as pd

1

2

3

第二节 数据重构

数据的合并

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")

1

2

3

4

观察数据可以发现各分数据分别代表原数据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)

1

2

3

4

5

6

7

8

9

10

11

2.4.3 使用DataFrame自带的方法join方法和append方法

#join:列横向合并  append:行纵向合并

up = left_up.join(right_up)

down = left_up.join(right_up)

result1 = up.append(down)

1

2

3

4

2.4.4 使用Pandas的merge方法和DataFrame的append方法

#merge本质上也是横向合并列,合并时需要有共同的列

up = pd.merge(left_up,rigth_up,left_index=True,right_index=True)

up.head()

1

2

3

>>>down=pd.merge(left_down,right_down,left_index = True,right_index = True)

>>>result2 = up.append(down)

>>>result2.shape

(891,12)

1

2

3

4

【总结】以上函数用法:

merge()和join()是横向拼接

concat()轴向连接,可以通过指定axis来改变拼接方向

append()是向dataframe对象中添加新的行,如果添加的列名不在dataframe对象中,将会被当作新的列进行添加

2.5 数据类型变换

2.5.1 将数据变成Series类型数据

#读取数据

data = pd.read_csv('result.csv')

data.head()

1

2

3

使用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

1

2

3

4

5

6

7

8

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()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

按性别分析年龄变量

df.groupby('Sex')['Age'].describe()

1

2

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()

1

2

3

4

5

6

7

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()

1

2

3

4

5

6

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

4

5

6

7

8

9

10

11

12

13

14

15

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

泰坦尼克号的票价男性与女性的平均票女性较男性高;

泰坦尼克号女性的存活人数多余男性;

客舱不同等级的存活人数的排序为等级1>等级3>等级2。

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

#按性别来分 对存活人数求和,对票价求平均

df.groupby('Sex').agg({'Survived':'sum','Fare':'mean'}).rename(

    columns = {'Survived':'Survived_sum','Fare':'Fare_mean'})

1

2

3

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

1

2

3

4

5

6

7

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')

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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'

————————————————

版权声明:本文为CSDN博主「呲花椒的喵酱」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_45409985/article/details/119837139

你可能感兴趣的:(数据重构)