复习:在前面我们已经学习了Pandas基础,知道利用Pandas读取csv数据的增删查改,今天我们要学习的就是探索性数据分析,主要介绍如何利用Pandas进行排序、算术计算以及计算描述函数describe()的使用。
1 第一章:探索性数据分析¶
开始之前,导入numpy、pandas包和数据¶
加载所需的库
import numpy as np import pandas as pd
载入之前保存的train_chinese.csv数据,关于泰坦尼克号的任务,我们就使用这个数据
df = pd.read_csv(“train_chinese.csv”)
1.6 了解你的数据吗?¶
教材《Python for Data Analysis》第五章
1.6.1 任务一:利用Pandas对示例数据进行排序,要求升序¶
具体请看《利用Python进行数据分析》第五章 排序和排名 部分
自己构建一个都为数字的DataFrame数据
‘’’ 我们举了一个例子 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 对象的索引行 ‘’’ df2 = pd.DataFrame(data=np.arange(8).reshape((2,4)), index=[2,1], columns=[‘d’, ‘a’, ‘b’, ‘c’]) df2.head() df2.sort_index() |
| d
| a
| b
| c
|
| —- | —- | —- | —- | —- |
|
1
| 4
| 5
| 6
| 7
|
|
2
| 0
| 1
| 2
| 3
|
【代码解析】
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中的数据根据某一列,升序排列
回答代码
df2.sort_values(“d”) |
| d
| a
| b
| c
|
| —- | —- | —- | —- | —- |
|
2
| 0
| 1
| 2
| 3
|
|
1
| 4
| 5
| 6
| 7
|
【思考】通过书本你能说出Pandas对DataFrame数据的其他排序方式吗?
sort_index
【总结】下面将不同的排序方式做一个总结
1.让行索引升序排序
代码
df2.sort_index() 2.让列索引升序排序
代码
df2.sort_index(axis=1) |
| a
| b
| c
| d
|
| —- | —- | —- | —- | —- |
|
2
| 1
| 2
| 3
| 0
|
|
1
| 5
| 6
| 7
| 4
|
3.让列索引降序排序
代码
df2.sort_index(axis=1, ascending=False) |
| d
| c
| b
| a
|
| —- | —- | —- | —- | —- |
|
2
| 0
| 3
| 2
| 1
|
|
1
| 4
| 7
| 6
| 5
|
4.让任选两列数据同时降序排序
代码
df2.sort_values(by=[‘a’, ‘c’], ascending=False) |
| d
| a
| b
| c
|
| —- | —- | —- | —- | —- |
|
1
| 4
| 5
| 6
| 7
|
|
2
| 0
| 1
| 2
| 3
|
1.6.2 任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从这个数据中你可以分析出什么?¶
‘’’ 在开始我们已经导入了train_chinese.csv数据,而且前面我们也学习了导入数据过程,根据上面学习,我们直接对目标列进行排序即可 head(20) : 读取前20条数据
‘’’
df3 = df.sort_values(by=[“票价”, “年龄”],ascending=False).head(20)
【思考】排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,这是相当高的一个比例,那么我们后面是不是可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系呢?当你开始发现数据之间的关系了,数据分析就开始了。
当然,这只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。
多做几个数据的排序
代码
df3.sort_values(“年龄”).loc[df3.是否幸存==0] |
| 乘客ID
| 是否幸存
| 仓位等级
| 姓名
| 性别
| 年龄
| 兄弟姐妹个数
| 父母子女个数
| 船票信息
| 票价
| 客舱
| 登船港口
|
| —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- |
|
27
| 28
| 0
| 1
| Fortune, Mr. Charles Alexander
| male
| 19.0
| 3
| 2
| 19950
| 263.0000
| C23 C25 C27
| S
|
|
118
| 119
| 0
| 1
| Baxter, Mr. Quigg Edmond
| male
| 24.0
| 0
| 1
| PC 17558
| 247.5208
| B58 B60
| C
|
|
377
| 378
| 0
| 1
| Widener, Mr. Harry Elkins
| male
| 27.0
| 0
| 2
| 113503
| 211.5000
| C82
| C
|
|
438
| 439
| 0
| 1
| Fortune, Mr. Mark
| male
| 64.0
| 1
| 4
| 19950
| 263.0000
| C23 C25 C27
| S
|
|
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
|
写下你的思考
头等舱有14名年纪中青年的存活了,去世的是小于27的和大于64的。中青年或许更容易存活。
1.6.3 任务三:利用Pandas进行算术计算,计算两个DataFrame数据相加结果¶
具体请看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分
自己构建两个都为数字的DataFrame数据
“”” 我们举了一个例子: 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_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’])
将frame_a和frame_b进行相加
代码
frame1_a + frame1_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 任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?¶
‘’’ 还是用之前导入的chinese_train.csv如果我们想看看在船上,最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’),我们该怎么做呢? ‘’’
代码
df[‘家族人数’] = df[‘兄弟姐妹个数’] + df[‘父母子女个数’] df.sort_values(‘家族人数’,ascending=False) |
| 乘客ID
| 是否幸存
| 仓位等级
| 姓名
| 性别
| 年龄
| 兄弟姐妹个数
| 父母子女个数
| 船票信息
| 票价
| 客舱
| 登船港口
| 家族人数
|
| —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- | —- |
|
180
| 181
| 0
| 3
| Sage, Miss. Constance Gladys
| female
| NaN
| 8
| 2
| CA. 2343
| 69.5500
| NaN
| S
| 10
|
|
846
| 847
| 0
| 3
| Sage, Mr. Douglas Bullen
| male
| NaN
| 8
| 2
| CA. 2343
| 69.5500
| NaN
| S
| 10
|
|
792
| 793
| 0
| 3
| Sage, Miss. Stella Anna
| female
| NaN
| 8
| 2
| CA. 2343
| 69.5500
| NaN
| S
| 10
|
|
201
| 202
| 0
| 3
| Sage, Mr. Frederick
| male
| NaN
| 8
| 2
| CA. 2343
| 69.5500
| NaN
| S
| 10
|
|
159
| 160
| 0
| 3
| Sage, Master. Thomas Henry
| male
| NaN
| 8
| 2
| CA. 2343
| 69.5500
| NaN
| S
| 10
|
|
...
| ...
| ...
| ...
| ...
| ...
| ...
| ...
| ...
| ...
| ...
| ...
| ...
| ...
|
|
499
| 500
| 0
| 3
| Svensson, Mr. Olof
| male
| 24.0
| 0
| 0
| 350035
| 7.7958
| NaN
| S
| 0
|
|
194
| 195
| 1
| 1
| Brown, Mrs. James Joseph (Margaret Tobin)
| female
| 44.0
| 0
| 0
| PC 17610
| 27.7208
| B4
| C
| 0
|
|
497
| 498
| 0
| 3
| Shellard, Mr. Frederick William
| male
| NaN
| 0
| 0
| C.A. 6212
| 15.1000
| NaN
| S
| 0
|
|
195
| 196
| 1
| 1
| Lurette, Miss. Elise
| female
| 58.0
| 0
| 0
| PC 17569
| 146.5208
| B80
| C
| 0
|
|
890
| 891
| 0
| 3
| Dooley, Mr. Patrick
| male
| 32.0
| 0
| 0
| 370376
| 7.7500
| NaN
| Q
| 0
|
891 rows × 13 columns 【提醒】我们只需找出”兄弟姐妹个数“和”父母子女个数“之和最大的数,当然你还可以想出很多方法和思考角度,欢迎你来说出你的看法。 max(df[‘兄弟姐妹个数’] + df[‘父母子女个数’]) 10#### 1.6.5 任务五:学会使用Pandas describe()函数查看数据基本统计信息¶函数查看数据基本统计信息)
(1) 关键知识点示例做一遍(简单数据)
具体请看《利用Python进行数据分析》第五章 汇总和计算描述统计 部分
自己构建一个有数字有空值的DataFrame数据
“”” 我们举了一个例子:
“”” 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
|
调用 describe 函数,观察frame2的数据基本信息
代码
frame2.describe() |
| 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
|
1.6.6 任务六:分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?¶
‘’’ 看看泰坦尼克号数据集中 票价 这列数据的基本统计数据 ‘’’
代码
df[‘票价’].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【思考】从上面数据我们可以看出,试试在下面写出你的看法。然后看看我们给出的答案。
当然,答案只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。
票价波动很大,最大值和75%的值之间相差非常大。
【思考】有更多想法,欢迎写在你的学习笔记中。
【总结】本节中我们通过Pandas的一些内置函数对数据进行了初步统计查看,这个过程最重要的不是大家得掌握这些函数,而是看懂从这些函数出来的数据,构建自己的数据分析思维,这也是第一章最重要的点,希望大家学完第一章能对数据有个基本认识,了解自己在做什么,为什么这么做,后面的章节我们将开始对数据进行清洗,进一步分析。