第五课内容:Pandas入门
剩余内容:
pandas DataFrame(数据框)
pandas Series
数据的选择案例:Iris 鸢尾花数据
数据的导入和观察
数据选择复习
数据可视化初探
这篇文章来讲 Iris 鸢尾花数据这个著名经典案例啦!
数据的导入和观察
然而,一开篇,又一次栽在数据读取上面。现在错误的显示太长了,一个屏幕都装不下了,淡淡的忧伤。。。所以我用2张图,给你们看看的错误有多长,我以为又是自己瞎的原因,没看出哪里有问题,跟着老师的代码再打一遍,一毛一样的满屏错误。。。你们感受一下:
余老师说,把代码放在同一个文件夹上,方便数据的获取。我觉得自己已经按照她的做法来了,回看几遍她的操作,没毛病啊!
可我还是获取不了啊。。。我想这不是和上次红酒数据一样的套路吗?看回自己的文章,系列8,还是找不出毛病。
然后去讨论去看有没有解决的方法:
队友们永远不会让我觉得自己很孤单。。。🤓
好吧,问老师去:
老师在前面停了一下,我觉得大概是他没看出我的代码是有问题的,所以难道是文件内容出事了?然后截图给他看。果然!
来个马后炮:我就说嘛,这个 txt 文件内容怎么那么奇怪!
这个时候突然想起我写的系列8 里面,有个截图,将怎么将数据转到自己的 jupyter 里面,为什么现在才想起来啊!!!😂😂😂
来,跟着我再来一遍:
在新生大学的《 Python编程&数据科学入门》这门课程中 ,作业区,有预习资料的链接,依照上图的路径显示: PythonData/ xinda / lesson05 / iris.txt 找到上图
——》在右上中的地方看到 “Raw”
——》点击选择:“链接存储为”,然后就成功下载了。
——》下一步就是在 jupyter 中新建一个 Text File
——》然后将下载好的 txt 文件,拉进新建的文档中。
——》命名为 “ iris.txt ”,然后这个文档就能被读取啦!
终于成功了!还是一样的老泪纵横。。。
太长了,我把头和尾截下来了。
然而,我们可以看到第一列的行首内容,是数据,也就是默认第一行的数据内容为行首了。因为我们没有赋值定义,所以第一个被挤上了位置。
那我们来给它们赋值定义出一个像样的行首吧:
在第一行给出了每一列的列名,好啦,各其所位!
在这里用的是 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 和 head 一样,后面空括号的话,自动取值后五位 ,或者前五位。
通过tail 和 head ,可以看到长数据的头部和尾部的内容,了解大概。
要是想要进一步知道整体数据的情况,可以用 info 这样的句型来运行了解。
可以看到整个 iris 数据的行数和列数,也能看到所对应的数据类型,甚至能看到这个存储数据的大小。
查看整个数据的形状,也就是行数和列数,用 shape:
这表示,iris 里面有150个观察值,5个变量。
往上翻一点点,可以看到,第 51 条中输出的数据,最后一列品种 species 不是浮点型,而是字符串。那我们想要知道,在整个 iris 的表格中,品种这一列都有哪些品种,也就是这一列不同的数据类型有哪些,怎么表达呢?
老师说用 unique 这个神奇的词汇;
这里的品种(species)是分类变量(categorical variable)。
来,升级一下,要是在知道品种的基础上,还想知道每个品种对应的数量呢?
统计不同品种的数量,可以使用DataFrame的value_counts方法来实现。这个方法通常可以用来统计频率。
关于变量的种类
第一类是数量型(quantitative)变量,其中又可以进一步分为两种:
连续型的(continuous),比如一个人的身高和体重,当天的温度等等。/离散型的(discrete),比如一个医院医生的人数,每天航班的次数等等。
第二类变量是性质型(qualitative)变量,也称为分类变量(categorical)其中也可以进一步分为两类:
无序型变量,比如人的性别,上面列子中鸢尾花的品种。/有序型(ordinal),比如人的教育(本科,硕士,博士),收入分组(低,中,高收入)。
数据选择复习
例1:选取花瓣数据,即 petal_length 和 petal_width 这两列
我们用三种方法,得出同样的结果:
以上三种方法,就是在上一篇文章中提到了内容啦,借用这个案例,运用起来。可以复习一下这些句型都有哪些,上面用到的就是以下加黑粗体的三个句型了:
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的数据行
方法一使用的是方括号的切片,方法二用的是 .iloc[ ]句型,方括号里面是先行索引,然后再列索引,因为列的内容全部呈现,所以用 冒号 来表示选取全部。
例3:选取品种为 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=(任何值)” 。
来来来,看大招了!
为了更加直观清晰,我们需要在同一个图表中,把三类不同品种的数据,用不同的颜色表示,是怎么操作的:
我觉得超级好看!🤓
不同品种的数据用不同的颜色来显示,直接在每一个数据后面添加 color 的赋值,后面用 label 来定义图中颜色的所属,我们可以看到这个图表的左上角,红绿黄三个不同颜色分表代表的数据,这样的图表就很直观了。
后面的 figsize=(10,6) 是把图表的尺寸变大了,我们来感受一下没变大之前的图表:
老师说要是我们后面需要对数据进行分类的时候,这样的散点图就能起很好的辅助作用了。
箱图
老师在这一小节开篇就演示了怎么求一堆数据的平均值和中位数,分别用的是之前就提过的 mean 来求平均值,和第一次见的 median 来求中位数。
这样求值老师觉得太麻烦,然后教了一个据说是很厉害很方便的方法:
老师说在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 这一列的分类数值进行分组