大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

文科生学Python系列10: Pandas鸢尾花案例

第五课内容:Pandas入门

剩余内容:

pandas DataFrame(数据框)

pandas Series

数据的选择

案例:Iris 鸢尾花数据

数据的导入和观察

数据选择复习

数据可视化初探

这篇文章来讲 Iris 鸢尾花数据这个著名经典案例啦!


数据的导入和观察

然而,一开篇,又一次栽在数据读取上面。现在错误的显示太长了,一个屏幕都装不下了,淡淡的忧伤。。。所以我用2张图,给你们看看的错误有多长,我以为又是自己瞎的原因,没看出哪里有问题,跟着老师的代码再打一遍,一毛一样的满屏错误。。。你们感受一下:



余老师说,把代码放在同一个文件夹上,方便数据的获取。我觉得自己已经按照她的做法来了,回看几遍她的操作,没毛病啊!

可我还是获取不了啊。。。我想这不是和上次红酒数据一样的套路吗?看回自己的文章,系列8,还是找不出毛病。

然后去讨论去看有没有解决的方法:


同学问题

同学问题

队友们永远不会让我觉得自己很孤单。。。

好吧,问老师去:


问老师的对话

出错的 iris.txt

老师在前面停了一下,我觉得大概是他没看出我的代码是有问题的,所以难道是文件内容出事了?然后截图给他看。果然!

来个马后炮:我就说嘛,这个 txt 文件内容怎么那么奇怪!

这个时候突然想起我写的系列8 里面,有个截图,将怎么将数据转到自己的 jupyter 里面,为什么现在才想起来啊!!!

来,跟着我再来一遍:


预习资料

在新生大学的《 Python编程&数据科学入门》这门课程中 ,作业区,有预习资料的链接,依照上图的路径显示: PythonData/ xinda / lesson05 / iris.txt 找到上图

——》在右上中的地方看到 “Raw”

——》点击选择:“链接存储为”,然后就成功下载了。

——》下一步就是在 jupyter 中新建一个 Text File

——》然后将下载好的 txt 文件,拉进新建的文档中。

——》命名为 “ iris.txt ”,然后这个文档就能被读取啦!


数据2-1

数据2-2

终于成功了!还是一样的老泪纵横。。。

太长了,我把头和尾截下来了。

然而,我们可以看到第一列的行首内容,是数据,也就是默认第一行的数据内容为行首了。因为我们没有赋值定义,所以第一个被挤上了位置。

那我们来给它们赋值定义出一个像样的行首吧:


用列表存储列标签

在第一行给出了每一列的列名,好啦,各其所位!

在这里用的是 col_names 来表示行首的名字内容。而 iris = pd.read_csv('iris.txt', names = col_names) 这句,在pandas中阅读一个叫 iris.txt 的 csv 文件。

啊,惨了,后面半句应该怎么解释。。。names = col_names,应该要理解为 第一行赋值行首的内容等同于 col_names ?可是在括号里面的逗号后面啊!!!!!这是什么鬼!!!!我卡住了。。。求解答


要是我们想要这一堆数据里面前面 10 行的数据呢,用的是 head 这个词汇来赋值定义。


列表取值

我试了一下,要是前面已经赋值完成的话,而且没有 restart 的前提下,直接用一个句子也是可以运行的:


取值

啊,懒人!用尽一切办法偷懒。。。

既然有 head,其实想当然就会有 尾巴 tail :


tail 的取值

tail 和 head 一样,后面空括号的话,自动取值后五位 ,或者前五位。

通过tail 和 head ,可以看到长数据的头部和尾部的内容,了解大概。

要是想要进一步知道整体数据的情况,可以用 info 这样的句型来运行了解。


使用info方法查看数据的总体信息

可以看到整个 iris 数据的行数和列数,也能看到所对应的数据类型,甚至能看到这个存储数据的大小。

查看整个数据的形状,也就是行数和列数,用 shape:


使用shape可以查看DataFrame的行数与列数

这表示,iris 里面有150个观察值,5个变量。

往上翻一点点,可以看到,第 51 条中输出的数据,最后一列品种 species 不是浮点型,而是字符串。那我们想要知道,在整个 iris 的表格中,品种这一列都有哪些品种,也就是这一列不同的数据类型有哪些,怎么表达呢?

老师说用 unique 这个神奇的词汇;


使用unique方法来对查看series中品种的名字

这里的品种(species)是分类变量(categorical variable)。

来,升级一下,要是在知道品种的基础上,还想知道每个品种对应的数量呢?


使用DataFrame的value_counts方法来实现

统计不同品种的数量,可以使用DataFrame的value_counts方法来实现。这个方法通常可以用来统计频率。

关于变量的种类

第一类是数量型(quantitative)变量,其中又可以进一步分为两种:

连续型的(continuous),比如一个人的身高和体重,当天的温度等等。/离散型的(discrete),比如一个医院医生的人数,每天航班的次数等等。

第二类变量是性质型(qualitative)变量,也称为分类变量(categorical)其中也可以进一步分为两类:

无序型变量,比如人的性别,上面列子中鸢尾花的品种。/有序型(ordinal),比如人的教育(本科,硕士,博士),收入分组(低,中,高收入)。

数据选择复习

例1:选取花瓣数据,即 petal_length 和 petal_width 这两列

我们用三种方法,得出同样的结果:


方法一:使用 [ [ ] ]

方法二:使用 .loc [ ]

方法三:使用 .iloc[ ]

以上三种方法,就是在上一篇文章中提到了内容啦,借用这个案例,运用起来。可以复习一下这些句型都有哪些,上面用到的就是以下加黑粗体的三个句型了:

df [ ['column_name'] ] —— 选取列,生成DataFrame 格式数据(如果只是用 [ ] 则产生一个series);

df [ 'column_name' ] —— 选取列,生成 Series 格式数据;

df.column_name —— 选取列,生成 Series 格式数据

使用loc和iloc方法,选择行和列:

df.loc[ ] —— 使用行和列的标签索引选取数据

df.iloc[ ] ——使用行和列的数值索引选取数据

可以看到,方法2和方法3,不同在于, .loc[ ] 是用标签索引来选取数据的,而 .iloc[ ] 是用数值来选取标签的。

我的理解就是,一个用关键词来得到结果,另一个则是用数字切片来获取结果。

例2:选取行索引为5-10的数据行


选取行索引为5-10的数据行

方法一使用的是方括号的切片,方法二用的是 .iloc[ ]句型,方括号里面是先行索引,然后再列索引,因为列的内容全部呈现,所以用 冒号 来表示选取全部。

例3:选取品种为 Iris-versicolor 的数据


选取品种为 Iris-versicolor 的数据

老师说,此处用的是布尔型索引。把 Iris-versicolor 这个种类,排在前5的都列出来了。


数据可视化初探

数据可视化一般是数据分析的第一步,让我们对数据有一个直观的了解。

通过可视化,我们往往可以观察到一些规律,这些观察到的规律可以对后续的建模起到指导作用。

可视化也是和非技术背景人沟通最有效的手段之一,不是所有人都懂得模型,但是大部分都可以理解图形

这堂课的高潮来啦!

把数据转换成图表!在Python中!有点激动了。来,先来看我们的输出图:


散点图

散点图往往用来反映两个变量的关系。设置图中横坐标和纵坐标:x轴上画出花瓣的长度,y轴上画出花瓣的宽度。用参数 kind=scatter ,表示要来绘制一个散点图。

老师说,在Python中,以%开头的成为 魔术关键字。这。。。真的很魔术。。。所以第69 条语句是为了后面的效果做铺垫的。

这部分内容我在等飞机起飞的途中进行的。因为没有网络了,我把复制下来的预习资料,跟着里面的代码打一遍。由于我复制过来的预习资料是显示不出图表的。然后运行69的时候,没有输出,我就在脑补这到底是个什么鬼图。。。然后70 的输出,让我愉快地让我忘记了 69 条没有图输出的不快。

回来之后,在听回老师讲的解释,第一句 %matplotlib inline 表示,下面的图形设置在notebook中,可以直接展示图形输出。注意DataFrame也是基于matplotlib作图的。

69 条第2句 %config InlineBackend.figure_format='retina' 是设置图片清晰度。终于知道为什么没有运行结果了,因为这两个“魔术关键字” 的铺垫,就是为了后面 70 条图形的形成啊~!

上面是一个简单的散点图,图中只有一种颜色来代表花瓣的长度和宽度。有时候我们看不同类型的数据分布,来看看是怎么操作的:


这上下是同一个运行结果

上面是三个不同品种的花瓣数据,输出结果是分别在3个不同的图表中。

要是我们想要把这三个图放在同一个图里面呢?加 ax=ax:


ax=ax,三图合一图

这个ax=ax 挺神奇的,我的理解,就是把一个钉子钉在一张图上,然后在另一张图也钉同样的钉子,做个记号,最后把这三张图蒙版合并处理成一张。关键是,要有同一个记号。经过我们上课的解答,老师说 ax=ax 其实句式是 “ ax=(任何值)” 。

来来来,看大招了!

为了更加直观清晰,我们需要在同一个图表中,把三类不同品种的数据,用不同的颜色表示,是怎么操作的:


使用布尔索引的方法分别获取三个品种的数据

我觉得超级好看!

不同品种的数据用不同的颜色来显示,直接在每一个数据后面添加 color 的赋值,后面用 label 来定义图中颜色的所属,我们可以看到这个图表的左上角,红绿黄三个不同颜色分表代表的数据,这样的图表就很直观了。

后面的 figsize=(10,6) 是把图表的尺寸变大了,我们来感受一下没变大之前的图表:


比较密集

老师说要是我们后面需要对数据进行分类的时候,这样的散点图就能起很好的辅助作用了。


箱图


平均值和中位数

老师在这一小节开篇就演示了怎么求一堆数据的平均值和中位数,分别用的是之前就提过的 mean 来求平均值,和第一次见的 median 来求中位数。

这样求值老师觉得太麻烦,然后教了一个据说是很厉害很方便的方法:


可以使用describe方法来总结数值变量

老师说在Pandas中一个很好用的方法就是用describe,可以看到一列数据中,所以数值类的统计量。

count 是数据量,告诉你在 sepal_length 中有 150 个数据点;

mean是平均值;

std是统计学的概念,为了不让懵逼的我们更加懵逼,老师说先不深究它是什么;

min和 max分别代表的是最小值和最大值;

剩下的25%,50%和75%,举例说明,比如25%,指的是 将数据从小到大排列之后,在 sepal_length 处于25%位置的那个数据就是5.1。其实50%就是中位数啦。

接下来就是箱图的演示了,其实我觉得箱图有点丑,没有上面的散点图好看。。。所以没有多大兴趣还没找到箱图吸引我的地方。。。


绘制花瓣宽度的箱图

这是一个花瓣宽度的箱图,所以索引是从 iris中找到 petal_width 这组数据,在 pandas 中的 plot 形式,这里的类型 kind='box'。大概 box 是这个世界箱图的代称,就像上面散点图的代称公式是:kind=‘scatter’。

箱图展示了数据中的中位数,四分位数,最大值,最小值。体现了数据的分布情况。

中间那条绿色的线,代表的是中位数所在的数,即50%。

横向的除了最上面和最下面的两根黑线(代表最小值和最大值)之外,还有两条蓝色的横线,下面那一条代表的是四分位数,即25%;上面那条代表的是75%。

还是和之前的诉求一样,要是我们需要把几个数据放进同一张图里面,怎么操作呢?


按品种分类,分别绘制不同品种花瓣宽度的箱图

获取的是花瓣宽度和品种这两类数据,这里又有一个新名词要学了:boxplot,这个函数后面是 (by='species'),也就是根据species 来分类绘图的。

调整一下这个图,删除里面的灰色线框,用 grid=False。然后把整个图变得稍微大一些,用刚刚那招 figsize:


按品种分类,分别绘制不同品种花瓣宽度的箱图

呃。。。稍微好看一点了。这三个图表示三种鸢尾花的花瓣宽度的数据,在这个箱图中可以发现,这三个不同品种的鸢尾花,在花瓣宽度上有着比较明显的区分,通过图表的方式,可以非常直观且方便的形式得出一些规律来。


作业5-2:

1,模仿上述例子,画出花萼宽度和长度的散点图,使用品种划分数据

2,模仿上述例子,画出花萼的长度的箱线图,使用品种划分数据

选做作业5-3:

根据今天课程学习内容,对提供的 WordIndex.csv 数据进行简单的查看和可视化分析。



这节课老师好用心,有下面这份资料。。。感动



本课索引

代码 说明

---导入pandas---

import pandas as pd 导入pandas包并将之简写为pd

---创建pandas中的DataFrame和Series---

pd.DataFrame() 创建 pandas DataFrame

pd.Series() 创建 pandas Series

---数据选择---

df.column_name 选取数据框的某一列,生成Series格式数据,df为数据框,column_name为列名

df['column_name'] 选取数据框的某一列,生成Series格式数据

df[['column_name']] 选取数据框的列,生成DataFrame格式数据

df.loc[ ] 使用行和列的标签索引选取数据

df.iloc[ ] 使用行和列的数值索引选取数据

---导入csv格式数据---

pd.read_csv() 在pandas中读取csv文本格式数据

---观察数据框---

df.head() 查看数据框df的前几行数据

df.tail() 查看数据框df的最后几行数据

df.info() 获取数据框df的信息

df.describe() 获取数据框df的各项统计值

df.index 查看数据框df的行索引

df.columns 查看数据框df的列名

df.shape 查看数据框df的形状,行数和列数

---Series数据的一些统计分析函数---

se.unique() 获取Series数据中的数值种类,一般用于分类数据,这里se为Series格式数据

se.value_counts() 统计Series数据中的数值种类及其对应的数据个数

se.mean() 计算Series数据的均值

se.std() 计算Series数据的标准差

se.median() 计算Series数据的中位数

se.max() 计算Series数据的最大值

se.min() 计算Series数据的最小值

se.count() 计算Series数据的个数

---pandas绘图函数---

df.plot(kind='scatter', x= , y= ) 绘制散点图

df.plot(kind='box') 绘制箱图

df.boxplot(by='column_name') 绘制箱图,并按 column_name 这一列的分类数值进行分组