复习:在前面我们已经学习了Pandas基础,知道利用Pandas读取csv数据的增删查改,今天我们要学习的就是探索性数据分析,主要介绍如何利用Pandas进行排序、算术计算以及计算描述函数describe()的使用。
1 第一章:探索性数据分析
开始之前,导入numpy、pandas包和数据
1 2 3
| import numpy as np import pandas as pd
|
1 2
| train_chinese = pd.read_csv('./titanic/train_chinese.csv')
|
1.6 了解你的数据吗?
教材《Python for Data Analysis》第五章
1.6.1
任务一:利用Pandas对示例数据进行排序,要求升序
1 2 3 4 5 6 7 8 9
|
frame = pd.DataFrame(np.arange(8).reshape((2, 4)), index=['2', '1'], columns=['d', 'a', 'b', 'c']) frame
|
|
|
d
|
a
|
b
|
c
|
|
2
|
0
|
1
|
2
|
3
|
|
1
|
4
|
5
|
6
|
7
|
【代码解析】
pd.DataFrame() :创建一个DataFrame对象
np.arange(8).reshape((2, 4)) :
生成一个二维数组(2*4),第一列:0,1,2,3 第二列:4,5,6,7
index=[’2, 1] :DataFrame 对象的索引列
columns=[‘d’, ‘a’, ‘b’, ‘c’] :DataFrame 对象的索引行
【问题】:大多数时候我们都是想根据列的值来排序,所以将你构建的DataFrame中的数据根据某一列,升序排列
1 2 3
|
frame.sort_values(by='b',ascending=False)
|
|
|
d
|
a
|
b
|
c
|
|
1
|
4
|
5
|
6
|
7
|
|
2
|
0
|
1
|
2
|
3
|
【思考】通过书本你能说出Pandas对DataFrame数据的其他排序方式吗?
【总结】下面将不同的排序方式做一个总结
1.让行索引升序排序
1 2
| frame.sort_index(ascending=True)
|
|
|
d
|
a
|
b
|
c
|
|
1
|
4
|
5
|
6
|
7
|
|
2
|
0
|
1
|
2
|
3
|
2.让列索引升序排序
1 2 3
|
frame.sort_index(axis=1)
|
|
|
a
|
b
|
c
|
d
|
|
2
|
1
|
2
|
3
|
0
|
|
1
|
5
|
6
|
7
|
4
|
3.让列索引降序排序
1 2
| frame.sort_index(axis=1, ascending=False)
|
|
|
d
|
c
|
b
|
a
|
|
2
|
0
|
3
|
2
|
1
|
|
1
|
4
|
7
|
6
|
5
|
4.让任选两列数据同时降序排序
1 2
| frame.sort_values(by=['a','b'],ascending=False)
|
|
|
d
|
a
|
b
|
c
|
|
1
|
4
|
5
|
6
|
7
|
|
2
|
0
|
1
|
2
|
3
|
1.6.2
任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从这个数据中你可以分析出什么?
1 2 3 4 5 6
| ''' 在开始我们已经导入了train_chinese.csv数据,而且前面我们也学习了导入数据过程,根据上面学习,我们直接对目标列进行排序即可 head(20) : 读取前20条数据 '''
train_chinese.sort_values(by=['票价','年龄'], ascending=False).head(20)
|
|
|
乘客ID
|
是否幸存
|
仓位等级
|
姓名
|
性别
|
年龄
|
兄弟姐妹个数
|
父母子女个数
|
船票信息
|
票价
|
客舱
|
登船港口
|
|
679
|
680
|
1
|
1
|
Cardeza, Mr. Thomas Drake Martinez
|
male
|
36.0
|
0
|
1
|
PC 17755
|
512.3292
|
B51 B53 B55
|
C
|
|
258
|
259
|
1
|
1
|
Ward, Miss. Anna
|
female
|
35.0
|
0
|
0
|
PC 17755
|
512.3292
|
NaN
|
C
|
|
737
|
738
|
1
|
1
|
Lesurer, Mr. Gustave J
|
male
|
35.0
|
0
|
0
|
PC 17755
|
512.3292
|
B101
|
C
|
|
438
|
439
|
0
|
1
|
Fortune, Mr. Mark
|
male
|
64.0
|
1
|
4
|
19950
|
263.0000
|
C23 C25 C27
|
S
|
|
341
|
342
|
1
|
1
|
Fortune, Miss. Alice Elizabeth
|
female
|
24.0
|
3
|
2
|
19950
|
263.0000
|
C23 C25 C27
|
S
|
|
88
|
89
|
1
|
1
|
Fortune, Miss. Mabel Helen
|
female
|
23.0
|
3
|
2
|
19950
|
263.0000
|
C23 C25 C27
|
S
|
|
27
|
28
|
0
|
1
|
Fortune, Mr. Charles Alexander
|
male
|
19.0
|
3
|
2
|
19950
|
263.0000
|
C23 C25 C27
|
S
|
|
742
|
743
|
1
|
1
|
Ryerson, Miss. Susan Parker “Suzette”
|
female
|
21.0
|
2
|
2
|
PC 17608
|
262.3750
|
B57 B59 B63 B66
|
C
|
|
311
|
312
|
1
|
1
|
Ryerson, Miss. Emily Borie
|
female
|
18.0
|
2
|
2
|
PC 17608
|
262.3750
|
B57 B59 B63 B66
|
C
|
|
299
|
300
|
1
|
1
|
Baxter, Mrs. James (Helene DeLaudeniere Chaput)
|
female
|
50.0
|
0
|
1
|
PC 17558
|
247.5208
|
B58 B60
|
C
|
|
118
|
119
|
0
|
1
|
Baxter, Mr. Quigg Edmond
|
male
|
24.0
|
0
|
1
|
PC 17558
|
247.5208
|
B58 B60
|
C
|
|
380
|
381
|
1
|
1
|
Bidois, Miss. Rosalie
|
female
|
42.0
|
0
|
0
|
PC 17757
|
227.5250
|
NaN
|
C
|
|
716
|
717
|
1
|
1
|
Endres, Miss. Caroline Louise
|
female
|
38.0
|
0
|
0
|
PC 17757
|
227.5250
|
C45
|
C
|
|
700
|
701
|
1
|
1
|
Astor, Mrs. John Jacob (Madeleine Talmadge Force)
|
female
|
18.0
|
1
|
0
|
PC 17757
|
227.5250
|
C62 C64
|
C
|
|
557
|
558
|
0
|
1
|
Robbins, Mr. Victor
|
male
|
NaN
|
0
|
0
|
PC 17757
|
227.5250
|
NaN
|
C
|
|
527
|
528
|
0
|
1
|
Farthing, Mr. John
|
male
|
NaN
|
0
|
0
|
PC 17483
|
221.7792
|
C95
|
S
|
|
377
|
378
|
0
|
1
|
Widener, Mr. Harry Elkins
|
male
|
27.0
|
0
|
2
|
113503
|
211.5000
|
C82
|
C
|
|
779
|
780
|
1
|
1
|
Robert, Mrs. Edward Scott (Elisabeth Walton Mc…
|
female
|
43.0
|
0
|
1
|
24160
|
211.3375
|
B3
|
S
|
|
730
|
731
|
1
|
1
|
Allen, Miss. Elisabeth Walton
|
female
|
29.0
|
0
|
0
|
24160
|
211.3375
|
B5
|
S
|
|
689
|
690
|
1
|
1
|
Madill, Miss. Georgette Alexandra
|
female
|
15.0
|
0
|
1
|
24160
|
211.3375
|
B5
|
S
|
【思考】排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,这是相当高的一个比例,那么我们后面是不是可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系呢?当你开始发现数据之间的关系了,数据分析就开始了。
当然,这只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。
多做几个数据的排序
1.6.3
任务三:利用Pandas进行算术计算,计算两个DataFrame数据相加结果
1 2 3 4 5 6 7 8 9 10 11 12
|
frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3), columns=['a', 'b', 'c'], index=['one', 'two', 'three']) frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3), columns=['a', 'e', 'c'], index=['first', 'one', 'two', 'second']) frame1_a, frame1_b
|
( a b c
one 0.0 1.0 2.0
two 3.0 4.0 5.0
three 6.0 7.0 8.0,
a e c
first 0.0 1.0 2.0
one 3.0 4.0 5.0
two 6.0 7.0 8.0
second 9.0 10.0 11.0)
将frame_a和frame_b进行相加
|
|
a
|
b
|
c
|
e
|
|
first
|
NaN
|
NaN
|
NaN
|
NaN
|
|
one
|
3.0
|
NaN
|
7.0
|
NaN
|
|
second
|
NaN
|
NaN
|
NaN
|
NaN
|
|
three
|
NaN
|
NaN
|
NaN
|
NaN
|
|
two
|
9.0
|
NaN
|
13.0
|
NaN
|
【提醒】两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。
当然,DataFrame还有很多算术运算,如减法,除法等,有兴趣的同学可以看《利用Python进行数据分析》第五章
算术运算与数据对齐 部分,多在网络上查找相关学习资料。
1.6.4
任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
1 2 3 4
| ''' 还是用之前导入的chinese_train.csv如果我们想看看在船上,最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’),我们该怎么做呢? ''' max(train_chinese['兄弟姐妹个数'] + train_chinese['父母子女个数'])
|
10
【提醒】我们只需找出”兄弟姐妹个数“和”父母子女个数“之和最大的数,当然你还可以想出很多方法和思考角度,欢迎你来说出你的看法。
多做几个数据的相加,看看你能分析出什么?
1.6.5
任务五:学会使用Pandas describe()函数查看数据基本统计信息
1 2 3 4 5 6 7 8 9 10 11 12
|
frame2 = pd.DataFrame([[1.4, np.nan], [7.1, -4.5], [np.nan, np.nan], [0.75, -1.3] ], index=['a', 'b', 'c', 'd'], columns=['one', 'two']) frame2
|
|
|
one
|
two
|
|
a
|
1.40
|
NaN
|
|
b
|
7.10
|
-4.5
|
|
c
|
NaN
|
NaN
|
|
d
|
0.75
|
-1.3
|
1 2 3 4 5 6 7 8 9 10 11 12
| frame2.describe() ''' count : 样本数据大小 mean : 样本数据的平均值 std : 样本数据的标准差 min : 样本数据的最小值 25% : 样本数据25%的时候的值 50% : 样本数据50%的时候的值 75% : 样本数据75%的时候的值 max : 样本数据的最大值 '''
|
|
|
one
|
two
|
|
count
|
3.000000
|
2.000000
|
|
mean
|
3.083333
|
-2.900000
|
|
std
|
3.493685
|
2.262742
|
|
min
|
0.750000
|
-4.500000
|
|
25%
|
1.075000
|
-3.700000
|
|
50%
|
1.400000
|
-2.900000
|
|
75%
|
4.250000
|
-2.100000
|
|
max
|
7.100000
|
-1.300000
|
调用 describe 函数,观察frame2的数据基本信息
1.6.6
任务六:分别看看泰坦尼克号数据集中 票价、父母子女
这列数据的基本统计数据,你能发现什么?
1 2 3
| ''' 看看泰坦尼克号数据集中 票价 这列数据的基本统计数据 '''
|
'\n看看泰坦尼克号数据集中 票价 这列数据的基本统计数据\n'
1 2
| train_chinese['票价'].describe()
|
count 891.000000
mean 32.204208
std 49.693429
min 0.000000
25% 7.910400
50% 14.454200
75% 31.000000
max 512.329200
Name: 票价, dtype: float64
【思考】从上面数据我们可以看出, 一共有891个票价数据,
平均值约为:32.20, 标准差约为49.69,说明票价波动特别大,
25%的人的票价是低于7.91的,50%的人的票价低于14.45,75%的人的票价低于31.00,
票价最大值约为512.33,最小值为0。
当然,答案只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。
多做几个组数据的统计,看看你能分析出什么?
1 2 3
| train_chinese['父母子女个数'].describe()
|
count 891.000000
mean 0.381594
std 0.806057
min 0.000000
25% 0.000000
50% 0.000000
75% 0.000000
max 6.000000
Name: 父母子女个数, dtype: float64
【思考】有更多想法,欢迎写在你的学习笔记中。
【总结】本节中我们通过Pandas的一些内置函数对数据进行了初步统计查看,这个过程最重要的不是大家得掌握这些函数,而是看懂从这些函数出来的数据,构建自己的数据分析思维,这也是第一章最重要的点,希望大家学完第一章能对数据有个基本认识,了解自己在做什么,为什么这么做,后面的章节我们将开始对数据进行清洗,进一步分析。