目录
2.1pandans数据结构
2.1.1创建Series数据
2.1.2创建DaraFrame属性
2.1.3索引对象
2.2pandas索引操作
2.2.1重新索引
2.2.2更换索引
2.2.3索引和选取
1 不通过函数选取行列
2 选取DataFrame数据的行和列
3 布尔选择
2.2.4操作行和列
1.增加
2.删除
3.修改
2.3pandas数据运算
2.3.1算数运算
2.3.2函数应用和映射
2.3.3排序
2.3.4汇总与统计
2.3.5唯一值和值计数
2.4层次化索引
2.4.1层次化索引简介
2.4.2重排分级顺序
2.4.3统计汇总
2.5pandas可视化
2.5.1线形图
2.5.2柱状图
2.5.3直方图和密度图
2.5.4散点图
2.6综合示例-小费数据集
2.6.1数据分析流程
2.6.2数据来源
2.6.3定义问题
2.6.4数据清洗
2.6.5数据探索
pandas又两个基本得数据结构:Series和Dataframe
Series数据结构类似于一维数组,但它是由一组数据(各种Numpy数据类型)和一组 对应得索引组成。通过一组列表数据即可产生最简单得Series数据,如图
Series数据:索引在左边,值在右边。可以看出,如果没有指定一组数据作为索引的话,Series数据会以0到N-1(N为数据的长度)作为索引,也可以通过指定索引的方式来创建Series数据,如图
Series有values和index属性,可返还值数据的数组形式和索引对象,如图
Series与普通的一维数组相比,其具有索引对象,可通过索引来获取Series的单个或一组数值,如图
Series运算都会保留索引和值之间的链接,如图
Series数据中的索引和值一一对应,类似于Python字典数据,所以也可以通过字典数据来创建Series,如图
由于字典结构是无序的,因此返回的Series也是无序的,这里依旧可以通过index指定索引的排列顺序,如图
Series数据和索引都有name属性,这样我们可以给Series定义名称,让Series具有可读性
DataFrame数据是Python数据分析最常用的数据,无论是创建的数据或外部数据,我们首先想到的都是如何将其转换为DataFrame数据,原因是DataFrame数据为表格型数据。说道表格型数据,多数人想到的可能是Excel表格,本节将会把DataFrame与Excel两种数据进行对比。
在Excel中,在单元格中输入数据即可创建一张表格。对于DataFrame数据而言,需要用代码实现,创建DataFrame数据的办法有很多,最常用的是传入数组、列表、或元祖组成的字典。如图
返回的数据如上图,DataFrame数据有行索引和列索引,行索引类似于Excel表格中每行的编号(没有指定索引的情况下),列索引类似于Excel表格的列名(通常也可称为字段)。
由于字典是无序的,因此可以通过columns指定列索引的排列顺序。如图
当没有指定索引的情况下,会使用0到N-1(N为数据的长度)作为行索引,这里也可以使用其他数据作为索引,如图
使用嵌套字典的数据也可以创建DataFrame数据,如图
下表提供列部分常用的为创建DataFrame数据可传入的数据类型
类型 | 使用说明 |
二维ndarray | 数据矩阵,可传入行列索引 |
由数组、列表或元组组成的字典 | |
由Series组成的字典 | 每个Series为一列,Series索引合并为行索引 |
嵌套字典 | |
字典或Series列表 | 各项成为DataFrame一行,字典键或Series索引成为DataFrame列索 |
由列表或元组组成的列表 | ‘’引类似于”二维数组’ |
如果df为某班级学生的信息,通过设置DataFrame的index和columns的name属性,可以将这些信息显示出来,如图
通过Values属性可以将DataFrame数组转换为二维数组,如图
注:各列数据类型不同,返回的数组会兼顾所有的数据类型
Series的索引和DataFrame的行和列索引都是索引对象,用于负责管理轴标签和元数据,如图
索引对象是不可以修改的,如果修改就会报错,如图
索引对象类似于数组数据,其功能也类似于一个固定大小的合计,如图
本节将针对Series和DataFrame数据,讲解Series和DataFrame索引操作的方法,通过将他们与Excel数据的类比,讲解DataFrame数据的选取与操作。
前面说过,索引对象是无法进行修改的,本节所说的重新索引并不是给索引重新命名,而是多索引重新排序,如果某个索引值不存在的话,就会引入缺失值,首先来看下Series重新排序后的索引,如图
对于DataFrame数据来说,行和列索引都是可以重新索引的,如图
重新索引列需要使用columns关键字,如图
下表为reindex函数的各参数使用说明
类型 | 使用说明 |
index | 用于索引的新序列 |
method | 填充缺失值的方法 |
fill_value | 缺失值填充 |
limit | 最大填充量 |
在DataFrame数据中,如果不希望使用默认行索引的话,可以在创建的时候通过index参数来 设置行索引。有时候我们希望将列数据作为索引,这时可以通过set_index方法来实现如下图
与set_index方法相反的方法时reset_index
下面说一个实际的例子。对于Excel而言,排序之后,行索引并不会发生变化(依旧是从1开始计数),而对DataFrame数据,排序之后其行索引会改变,如图
这里获取成绩倒数两位同学的数据的话,需要记住其单独的索引。但当数据量大的时候,想查看多维排序过后的数据时,这种做法是很不方便的。我们可以通过恢复索引,对数据进行排序。如下图,原索引可通过drop参数进行删除。
在数据分析中,选取需要的数据进行处理和分析是很重要的。在Excel表格中,通过鼠标点选或者扩选可以轻松地选取数据,而在pandas数据中,需要通过索引来完成数据的选取工作。
Series数据的选取较为简单,使用方法类似于Python的列表,这里不仅可以通过0到N-1(N是数据长度)来进行索引,同时也可以通过设置好的索引标签来进行索引。如下图
切片运算与python列表略有不同,如果是利用索引切片,其尾端是被包含的,如下图
DataFrame数据的选取更复杂些,因为它是二维数组,选取列和行都有具体的使用方法。
通过两个中括号,可以获取多个列的数据,如下图
注:选取列不能用切片,因为切片用于选取行数据
df_1.loc[[index],[colum]]通过标签选取数据
df_1.iloc[[index],[colum]]通过位置选取数据
以df2为例子,筛选出性别为famale的数据,这时就需要用布尔选择来完成。与数组布尔索引类似,既可以使用布尔选择,那么同样也适用于不等号(!=)等逻辑运算符
在数据分析中,常用的基本操作为 增删改查,在前面的内容中 查 已经详细讲解过了
以df数据为例,该班级转来一个新生,需要在原有数据的基础上增加一行数据。可以通过append函数传入字典结构数据即可,如下图
这些学生都是2018级的,这里我们新建一列用于存放该信息。为一个不存在的列赋值,即可创建一个新列。
如果要新增的列中的数值不一样时,可以传入列表或数组结构数据进行赋值,如图
如果王五同学转学列,class字段没有用列,就需要删除其信息。通过drop方法可以删除指定轴上的信息。
这里的改指的是行和列标签的修改,通过rename函数,可完成由于某些原因导致的标签录入错误的问题
本节将针对Series和DataFrame数据,详细讲解二者的算数运行和函数的应用,这在数据分析中很重要!
pandas的数据对象在进行算数运算时,如果有相同索引对则进行算数运算,如果没有则会引入缺失值,这就是数据对齐。
对于DataFrame数据而言,对齐操作会同时发生在行和列上,如图
DataFrame和Series数据在进行运算时,先通过Series的索引匹配到相应的DataFrame列索引上,然后沿行向下运算(广播),如图
在数据分析时,常常会对数据进行较复杂的数据运算,这时需要定义函数。定义好的函数可以应用到pandas数据中,其中有三种方法:map函数,将函数套用在Series的每个元素中,apply函数,将函数套用到DataFrame的行与列上:applymap函数,将函数套用到DataFrame的每个元素上。
如图,需要把price列的“元”字去掉,这时就需要用到map函数,如图
apply使用方法如下
注:lambda为匿名函数,和定义好的函数一样,可以节省代码量
applymap函数可以作用于每个元素,便于对整个DataFrame数据进行批量处理,如图
在Series中,通过sort_index函数可对索引进行排序,默认情况为升序,如图
通过sort_values方法可对值进行排序
对于DataFrame数据而言,通过指定轴方向,使用sort_index函数可对行或列索引进行排序(添加参数axis=1/0)。要根据列进行 排序,可以通过sort_values函数,把列名传给by参数即可
在DataFrame数据中,通过sum函数可以对每列进行求和汇总,与Excel中的sum函数类似,如图
指定轴方向,通过sum函数可按行汇总
describe方法可对每个数值型列进行统计,经常用于对数据的初步观察时使用,如图
在Series中,通过unique函数可以获取不重复的数组,如图
通过values_counts方法可统计没个值出现的次数,如图
层出化索引时pandas重要的功能之一 ,本节将简单讲解层次化索引的创建过程和使用方法
简单地说,层次化索引就是轴上有多个级别索引,如下图,为创建一个层次化索引的Series对象
该索引对象为MultiIndex对象,如图
层次化索引的对象,索引和选取操作都很简单,如下图
对于DataFrame数据而言,行和列索引都可以转换为层次化索引
通过swaplevel方法可以对层次化索引进行重排,如图
在层次话索引的pandas数据进行统计汇总时,可以通过level参数指定在某层次上进行汇总统计
这里的运算又点拗口,大家仔细想想就能够理解。
pandas库中继承了matplotlib中的基础组件,让绘图更加简单。
线形图通常用于描绘两组数据之间的趋势。例如,销售行中月份与销量之间的趋势情况:金融行中股票收盘价与时间序列之间的趋势。
pandas库中的Series和DataFrame中都有绘制各类图标的plot方法,默认情况绘制的是线形图。首先创建一个Series对象
注:%matplotlib inline为魔法函数,使用该函数绘制的图片会直接显示在Notebook中
通过s.plot方法可以绘制线形图,如下图。从图中可以看出,Series的索引作为X轴,值作为Y轴。
通过DataFrame数据的plot方法可以为各列绘制一条线,并会给其创建好图例。首先创建DataFrame数据,如下图
关于pandas绘图的参数,会在实际案例中具体介绍。
柱状图长绘制各类别之间的关系。例如,班级中男生和女生的分布状况,某零售店个商品的购买数量分布情况。通过绘制pandas绘制柱状图很简单,只需要在plot参数中添加kind=‘bar’,如果类别比较多,可以绘制水平柱状图(kind='bar')
首先,创建一个DataFrame数据的学生信息表格,如果需要分析班级男女比例是否平衡,这时候就可以使用柱状图,通过value_counts计数,获取男女计数的Series数据,进行绘制柱状图
对于DataFrame数据而言,每一行的值都会成为一组,如下图
设置plot函数的stacked参数可以绘制堆积柱状图,如下图
直方图用于频率分布,y轴可为数值或者比率。直方图在统计分析中是经常使用的,绘制数据的直方图,可以看出其大概分布规律。例如,某班级的身高情况一般是服从正态分布,即高个子和矮个子人较少,大部分都是在平均身高左右。
可通过hist方法绘制直方图
注:通过设置grid参数可在图表中添加网格,bins参数是将值分为多少个段,默认为10
核密度估计(Kernel Density E身体马特,KDE)是对真实密度的估计,其过程是将数据的分布近似为一组核(如正态分布)。通过plot函数的kind=‘kde’可进行绘制,如图
散点图主要用来表现数据之间的规律。例如,身高和体重之间的规律。下面创建一个DataFrame数据,然后绘制散点图
本节主要讲解数据分析的基本流程,对小费数据集进行数据的分析与可视化
数据分析流程通常情况下分为5步。
(1)收集数据。在这一步中,需要对收集的数据有一定的认知,对个字段的含义和背景知识都要有着足够的理解。
(2)定义问题。根据各组的行业和业务知识,对数据定义多个待解决的问题。
(3)数据清洗与整理。由于各种问题,获取的数据不够“干净”,需要通过各种手段对数据进行清洗与整理,一边得到准确的分析结果。
(4)数据探索。通过可视化等手段,对数据进行分析和探索,得出结论
(5)数据展示。这部分用于输出,或撰写数据分析报告、或汇报给上级、或绘制PPT。
以上只是基本的数据分析流程,会根据实际情况的不同略有不同。例如,在实际工作中,第(1)步和第(2)步会有所颠倒,首先明确目标,然后再根据目标收集数据:再数据探索方面,也会使用数据挖掘等技术实现更具复杂和有实际操作意义的模型。
小费数据来源与Python第三方库Seaborn(用于绘图)中自带的数据,加载该数据集(需要先把数据集下载到本地)
注:head函数会返回5条数据,也可指定返回数据行数。
众所周知,在西方国家的服务行业中,顾客会给服务员一些小费。该小费数据为餐饮行业收集的数据。total_bill列为消费总金额,tip为小费金额,sex为顾客性别,smoker为顾客是否抽烟,day为小费的星期,time为聚餐的时间段,size为聚餐人数
本次分析中,围绕小费数据提出几个问题:小费金额与消费总金额是否存在相关性?性别、是否吸烟、星期几、中/晚餐和小费金额是否有一定的关联?小费金额占消费总金额的百分比是否服从正态分布?
首先对数据进行简单描述,看是否有缺失值或者异常值
通过结果可以看出,总共有244条数据,通过统计暂时看不出是否有缺失值。通过打印数据的info信息可以看出每列数据的类型和缺失值,本例中的小费数据集没有任何缺失值如下图
注:本数据集非常的“干净”,数据清洗的内容在后面将会详细讲解。
首先对小费金额与消费总额进行分析,看看他们之间是否存在关联,通过下面的代码绘制散点图
从图中可以看出,小费金额与消费总金额存在这正相关关系,即消费越高,给的小费越多,这是比较合理的。
我们来看下性别不一样是否会影响小费的金额。这里使用柱状图,通过布尔选择男女,对消费数据进行平均后绘制柱状图,具体操作如下
水平柱状图显示,女性小费金额少于男性小费金额。
注意:这种通过类别汇总的方法比较麻烦,后面讲解了groupby方法会简单许多。
其他字段与小费的关系也是类似的方法。例如,日期与小费的关系,由于观察数据时只看到前5行数据,,通过unique函数看下日期的唯一值有哪些
日期平均小费柱状图如下图,可以看出,周六周日的小费比周四周五的高
最后我们来 分析以下小费百分比的分布状况,这里小费总金额为小费的金额和聚餐所花费的金额,通过DataFrame算数运算,新建一列,用于存储小费百分比
直方图如图所示,可以看出基本符合正态分布,但也有几个异常点。