数据重构

动手学数据分析 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 复习:在前面我们已经学习了Pandas基础,第二章我们开始进入数据分析的业务部分,在第二章第一节的内容中,我们学习...
    趁着年轻去旅游阅读 206评论 0 0
  • 2.4 数据合并 2.4.1载入数据 text_left_up=pd.read_csv('./titanic/da...
    Akai_阅读 216评论 0 0
  • 数据重构 1.数据合并 导入numpy、pandas包和数据 import numpy as npimport p...
    cherry_7阅读 216评论 0 0
  • 1.数据合并 1.1数据合并方法对比 pd.merge:数据横向合并,merge(左表,右表)输入两个数据框,设置...
    忘词x阅读 243评论 0 0
  • 探索数据集-泰坦尼克号数据 一、读取数据 import pandas as pdimport numpy as n...
    杨小彤阅读 810评论 0 1