在第一第二课已经讲了notebook的基础使用,python的基础语法及常用的数据结构及其运算,包括:
其中,前五种类型是不可变类型,后三种是可变类型,而不可变类型才能作为集合的元素或者字典的键。(实际上,基础类型还有一个None类型,该类型只有一个值None)
在第三第四课也还讲了:
有了这些,基本上可以使用python实现基础的数据分析了。本次课从解决问题入手,假设我们有一个班级的学生的期末考试的成绩的Excel表格,我们现在要实现一些简单的数据分析,主要解决以下问题:
作为这个系列的最后一篇,今天要要用Python来完成这些基础的数据分析。
说明:下面都是基于notebook进行。
Excel表格包含4个字段:姓名,性别,语文成绩,数学成绩等,如下:
这就是一个普通的Excel表格。
在统计之前,需要先将Excel表格的内容读入内存:
import pandas as pd
data = pd.read_excel('学生成绩表.xlsx')
# 查看前几行
# 该函数通常是用来查看数据的
data.head()
我们使用pandas这个包来进行数据分析之前,需要先将Excel表格读入内存中,head方法可以显示前几行(默认是5行):
Excel表格中的第一行自动作为列名(也成为列索引),第一列“学生”的左边还有一列数字0,1,2,3...,这是行索引。通过行索引可以找到对应的行,通过列名也可以找到对应的列,下面会有使用。
类似head方法的,还有一个tail方法,用来查看表格数据的最后几行。
在我们的例子里,每一行表示一个学生,所以统计人数,只需要计算行数即可:
len函数可以直接返回行数,而常用的应该是使用shape这个属性,返回的是数据的shape,如上的(50, 4),表示该数据集有50行4列的数据。
在pandas中,计算均值的方法是mean:
mean可以直接用在整个数据集(表格)上,这样会直接计算所有数值型字段的均值;也可以单独用着某个字段(列)上,在pandas中访问某个列,只需要使用列名做下标进行访问即可。
类似mean的方法,还有好几个,如max,min,std等。
计算总分的平均分,如果有一个叫总分的列,那就简单了,不过我们的表格本没有总分这一列,所以我们可以先增加一个总分的列,然后计算这一列的均值。
这个思路可以比对在Excel中的操作。
从上,我们可以看到,往表格增加一个列是非常简单的,这个其实跟在Excel中是非常类似的。
对数据进行排序经常也是经常需要进行的。
在pandas中,可以使用sort_values来对数据进行排序:
如果ignore_index设置为False,则学生这一列的左侧的索引就会跟原来的索引一样,例如学生30的索引原来是29。
排序好的数据,我们可以进行导出:
# index=False:这是为了避免将数据的索引也保存到Excel文件中
data_save.to_excel('排序好的成绩表.xlsx', index=False)
分组统计有两种方式可以用,一种是分组(groupby),另一种是透视表。
我们在做数据分析时,分组统计是最基础的操作之一。
在pandas中,groupby可以用来做分组,它返回的是一个可循环的对象,这个对象有一个size方法,就能计算出男生和女生的人数。
对于groupby方法返回值的结构,因为其实一个可循环的对象,所以我们可以直接转化为列表,来查看这个对象的结构:
list(groups)
在notebook中会显示:
[('女',
学生 性别 语文成绩 数学成绩 总分
3 学生04 女 40 56 96
4 学生05 女 67 79 146
5 学生06 女 84 55 139
......
48 学生49 女 39 51 90),
('男',
学生 性别 语文成绩 数学成绩 总分
0 学生01 男 93 55 148
1 学生02 男 85 82 167
2 学生03 男 21 91 112
......
49 学生50 男 87 52 139)]
这个列表有两个元素,每个元素又是一个元组,元组的第一个元素值是性别,第二个元素其实是一个pandas表格(DataFrame)。
分组对象(GroupBy)其实也是有mean方法的:
类似的还有min,max,std等。
要计算及格人数和不及格人数,那我们首先需要判断每一个人是否及格:
这已经成功计算了每一个学生的各科成绩是否及格。不过作为一个强迫症患者,True和False实在看不下去:
这样看着才算比较顺眼一点。有了及格和不及格字段,类似Excel表格中的透视表功能,pandas也有透视表函数:
所谓透视表,涉及到的重要参数有:列字段(columns),行字段(index),值字段(values),还有就是值字段的计算函数aggfunc。图示如下:
这个和Excel中的透视表是非常类似的:
不同版本的Excel会略有不同。
查看某列数据的值的分布,这也是常见的分析。
我们将总分的划分到不同的区间上,每10分一个区间,统计各个区间上的人数:
然后我们使用plot来画一个直方图:
可视化是分析非常重要的手段,我们在画一个饼图:
对于一些简单的可视化,使用pandas的plot基本也是够的,如果是一些比较复杂的,那就需要使用Matplotlib包了。要想做好数据分析,可视化是必备的技能之一。
上面我们已经讲解完了使用pandas来进行数据分析的基础功能,作为练习:
import numpy as np
import pandas as pd
names = ['学生%02d' % i for i in range(1, 51)]
sexes = ['男' if i >= 0.5 else '女' for i in np.random.rand(50)]
scores1 = 65 + np.int64(20*np.random.randn(50))
scores2 = 60 + np.int64(25*np.random.randn(50))
scores1 = [i if i < 100 else 100 for i in scores1]
scores1 = [i if i > 0 else 0 for i in scores1]
scores2 = [i if i < 100 else 100 for i in scores2]
scores2 = [i if i > 0 else 0 for i in scores2]
df = pd.DataFrame([names, sexes, scores1, scores2]).T
df.columns = ['学生', '性别', '语文成绩', '数学成绩']
df.to_excel('学生成绩表.xlsx')
Pandas 是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。经过多年不懈的努力,Pandas 离这个目标已经越来越近了。
Pandas 适用于处理以下类型的数据:
Pandas 的主要数据结构是 Series(一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。对于 R 用户,DataFrame 提供了比 R 语言 data.frame 更丰富的功能。Pandas 基于 NumPy 开发,可以与其它第三方科学计算支持库完美集成。
Pandas 就像一把万能瑞士军刀,做数据分析优势明显。
文档:https://www.pypandas.cn/intro/
Pandas有两种基础数据结构:
维数 | 名称 | 描述 |
---|---|---|
1 | Series | 带标签的一维同构数组 |
2 | DataFrame | 带标签的,大小可变的,二维异构表格 |
从理解上说,可以将Series理解为Excel中的列,一列就对应一个Series结构的数据,而DataFrame可以理解为对应一个Excel表格,一个表格可以包含多列(Series)。
通常情况下,Pandas是面向列的计算,例如计算某列的均值等。