Python数据分析——pandas

pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

3.1 pandas数据结构
3.1.1:创建Series数据
Series数 据结构类似于一维数组,但它是由 一组数据(各种NumPy数据类型)和一组对应的索引组成的。
需要引入pandas模块:import pandas as pd
需要引入Series和DataFrame:
from pandas import Series,DataFrame
在这里插入图片描述
Series数据:索引在左边,值在右边。如果没有指定一组数据作为索引的话,Series数据会以0到N-1(N为数据的长度)作为索引,也可以通过指定索引的方式来创建Series数据。
在这里插入图片描述
Series有values和index属性,可返回值数据的数组形式和索引对象。
在这里插入图片描述
Series与普通的一维数组相比,其具有索引对象,可通过索引来获取Series的单个或一组值。
在这里插入图片描述
Series运算都会保留索引和值之间的链接:

在这里插入图片描述
Series数组中的索引和只是一一对应的,类似于Python字典数据,所以也可以通过字典数据来创建Seriesl。
在这里插入图片描述
由于字典结构是无序的,因此返回的Server也是无序的。这里依旧可以通过index指定索引的排列顺序。
Server对象和索引都有name属性,这里我们就可以给Server定义名称。让Server更具有可读性。
在这里插入图片描述

在这里插入图片描述
3.1.2:创建DataFrame数据
DataFrame数据是Python数据分析最常用的数据,无论是创建的数据或外部数据 ,我们首 先想到的都是如何将其转换为DataFrame数据,原因是DataFrame为表格型数据。我们最常见的表格型数据,就是Excel表格。
创建DataFrame数据的办法有很多,最常用的是传入由数组、列表或元组组成的字典。
在这里插入图片描述
DateFream数据具有行索引和列索引,行索引类似于Excel表格中每行的编号(没有指定索引的情况下),列索引类似于Excel表格的列名(通常也可称为字段)。
由于字典是无序的,因此可以通过columns指定列索引的排列顺序。
在这里插入图片描述
当没有指定行索引的情况下,会使用0到N-1(N为数据的长度)作为行索引,这里也可以使用其他数据作为行索引。
在这里插入图片描述
使用嵌套字典的数据也可以创建DataFrame数据。
在这里插入图片描述
下表中提供了部分常用的为创建DataFrame数据可传入的数据类型。
在这里插入图片描述
1、二维ndarray:数据矩阵,可传入行列索引。
在这里插入图片描述
2、由数组、列表或元组组成的字典:书上已举例子(图3.9所示)
3、由Series组成的字典:每个Series为一列,Series索引合并为行索引。
在这里插入图片描述
4、嵌套字典:书上已举例子(如图3.13所示)
5、字典或Series的列表:各项成为DataFrame一行,字典键或Series索引成为DataFrame列索引。
在这里插入图片描述
6、由列表或元组组成的列表:类似于“二维数组”。
在这里插入图片描述
如果DataFrame为某班级学生的信息,通过设置DataFrame的index和columns的name属性,可以将这些信息显示出来。
在这里插入图片描述
通过values属性可以将DataFrame数据转换为二维数组。
在这里插入图片描述
注意:各列数据类型不同,返回的数组会兼顾所有数据类型,本例中数据类型为object。
3.1.3:索引对象
Series的索引和DataFrame的行和列索引都是索引对象,用于负责管理轴标签和元数据。
索引对象是不可以进行修改的,如果修改就会报错:
TypeError:Index does not support mutable operations
在这里插入图片描述
索引对象类似于数组数据,其功能也类似于一个固定大小的集合。
在这里插入图片描述
3.2:Pandas索引操作:
本节将针对Series和DataFrame数据,讲解Series和DataFrame索引操作的方法,通过将它们与Excel数据的类比,讲解DataFrame数据的选取与操作。
3.2.1:重新索引
这里所说的重新索引并不是给索引重新命名,而是对索引重新排序,如果某个索引值不存在的话,就会引入缺失值(NaN)。首先来看下Series重新排序后的索引。
在这里插入图片描述
如果需要对插入的缺失值进行填充的话,可通过method参数来实现,参数值为ffill或pad时为向前填充,参数值为bfill或backfill时为向后填充。
在这里插入图片描述
在这里插入图片描述
对于DataFrame数据来说,行和列索引都是可以重新索引的。

在这里插入图片描述
在这里插入图片描述
如下表所示,reindex函数的各参数使用说明。
在这里插入图片描述
3.2.2:更换索引
在DataFrame数据中,如果不希望使用默认行索引的话,可在创建的时候通过index参数来设置行索引。有时我们希望将列数据作为行索引,这时可以通过set_index方法来实现。
在这里插入图片描述
与set_index方法相反的方法是reset_index(恢复索引)方法。
在这里插入图片描述
对于Excel表格而言,排序之后,行索引并不会发生改变(依旧是从1开始计数),而对DataFrame数据,排序之后其行索引会改变。
在这里插入图片描述
对于上面的例子,如果要获取成绩倒数两位同学的数据的话,需要记住其单独的索引。但当数据量大的时候,想查看多位排序过后的数据时,这种做法是很不方便的。我们可以通过恢复索引,对数据进行排序,这样操作起来会方便很多。
在这里插入图片描述
原索引可通过drop参数进行删除。
在这里插入图片描述
3.2.3:索引和选取
在pandas数据中,需要通过索引来完成数据的选取工作。Series数据的选取较为简单,使用方法类似于Python的列表,这里不仅可以通过0到N-1(N是数据长度)来进行索引,同时也可以通过设置好的索引标签来进行索引。
在这里插入图片描述

切片运算与Python列表略有不同,如果是利用索引标签切片,其尾段是被包含的。
在这里插入图片描述
DataFrame数据的选取更复杂些,因为它是二维数组,选取列和行都有具体的使用方法。接下来将重点介绍DataFrame数据的选取。
1.选取列
通过列索引标签或以属性的方式可以单独获取DataFrame的列数据,返回的数据为Series结构。
通过两个中括号,可以获取多个列的数据。
注意:选取列不能使用切片,因为切片用于选取行数据。
在这里插入图片描述
2:选取行
通过行索引标签或行索引位置(0到N-1)的切片形式可选取DataFrame的行数据。
切片方法选取行有很大的局限性。如果想获取单独的几行,通过loc和iloc方法可以实现。loc方法是按行索引标签选取数据;iloc方法是按行索引位置选取数据。
在这里插入图片描述
在这里插入图片描述
3.选取行和列
在数据分析中,有时可能只是对部分行和列进行操作,这时就需要选取DataFrame数据中行和列的子集,而通过ix方法就可以轻松地完成。ix方法同时支持索引标签和索引位置来进行行数据的选取。但在新版的Python中,ix已被废弃。
在这里插入图片描述
用ix选取行列的方式可以用如下代码代替:
在这里插入图片描述
4.布尔选择
以上面出现的df2为例,筛选出性别为female的数据,这时就需要通过布尔选择来完成。
在这里插入图片描述

在这里插入图片描述

与数组布尔型索引类似,既然可以使用布尔选择,那么同样也适用于不等于符号(!=)、负号(-)、和(&)、或(|)。
在这里插入图片描述
3.2.4:操作行和列
在数据分析中,常用的基本操作为“增、删、改、查”,查(选取)在前面内容中已经详细讲解过,本节主要讲解其余的3个操作。
1.增加
以df数据为例,该班级转来了一个新生,需要在原有数据的基础上增加一行数据。可以通过append函数传入字典结构数据即可。
在这里插入图片描述
这些学生都是2018级的,这里我们新建一列用于存放该信息。为一个不存在的列赋值,即可创建一个新列。 如果要新增的列中的数值不一样时,可以传入列表或数组结构数据进行赋值。
在这里插入图片描述
在这里插入图片描述
2、删除
如果王五同学转学了,class字段没有用了,就需要删除其信息。通过drop方法可以删除指定轴上的信息。
在这里插入图片描述
3、修改
这里的“改”指的是行和列索引标签的修改,通过rename函数,可完成由于某些原因导致的标签录入错误的问题。
在这里插入图片描述
3.3 pandas数据运算
3.3.1:算术运算
pandas的数据对象在进行算术运算时,如果有相同索引对则进行算术运算,如果没有则会引入缺失值,这就是数据对齐。右侧是一个Series数据算术运算的例子。
在这里插入图片描述
对于DataFrame数据而言,对齐操作会同时发生在行和列上。
在这里插入图片描述
DataFrame和Series数据在进行运算时,先通过Series的索引匹配到相应的DataFrame列索引上,然后沿行向下运算(广播)。
在这里插入图片描述
3.3.2:函数应用和映射
在数据分析时,常常会对数据进行较复杂的数据运算,这时需要定义函数。定义好的函数可以应用到pandas数据中,其中有三种方法:map函数,将函数套用在Series的每个元素中;apply函数,将函数套用到DataFrame的行与列上;applymap函数,将函数套用到DataFrame的每个元素上。
下面例子中,需要把price列的“元”字去掉,这时就需要用到map函数。
在这里插入图片描述
apply函数的使用方法如下:
注意:lambda为匿名函数,和定义好的函数一样,可以节省代码量
在这里插入图片描述
applymap函数可作用于每个元素,便于对整个DataFrame数据进行批量处理。
在这里插入图片描述
3.3.3:排序
在Series中,通过sort_index函数可对索引进行排序,默认情况为升序。
在这里插入图片描述
通过sort_values方法可对值进行排序。
在这里插入图片描述
pandas排序函数sort_values:
pandas中的sort_values()函数原理类似于SQL中的order by,可以将数据集依照某个字段中的数据进行排序,该函数即可根据指定列数据也可根据指定行的数据排序。用法如下:
DataFrame.sort_values(by=‘##’,axis=0,ascending=True, inplace=False, na_position=‘last’)
在这里插入图片描述
对于DataFrame数据而言,通过指定轴方向,使用sort_index函数可对行或者列索引进行排序。要根据列进行排序,可以通过sort_values函数,把列名传给by参数即可。
在这里插入图片描述
在这里插入图片描述
3.3.4:汇总与统计
在DataFrame数据中,通过sum函数可以对每列进行求和汇总,与Excel中的sum函数类似。
指定轴方向,通过sum函数可按行汇总。
在这里插入图片描述
在这里插入图片描述
describe方法可对每个数值型列进行统计,经常用于对数据的初步观察时使用。
25%, 50%和75%是对应的四分位数。
在这里插入图片描述
3.3.5:唯一值和值计数
在Series中,通过unique函数可以获取不重复的数组。
通过values_counts方法可统计每个值出现的次数。
注意:对于DataFrame的列而言,unique函数和values_counts方法同样适用。
在这里插入图片描述
在这里插入图片描述
3.4 层次化索引
3.4.1:层次化索引简介
简单地说,层次化索引就是轴上有多个级别索引。下面例子为创建一个层次化索引的Series对象。
在这里插入图片描述
上一个例子中的索引对象为MultiIndex对象。
在这里插入图片描述
层次化索引的对象,索引和选取操作都很简单。
在这里插入图片描述
对于DataFrame数据而言,行和列索引都可以为层次化索引。选取数据也很简单。
在这里插入图片描述
在这里插入图片描述
3.4.2:重排分级顺序
通过swaplevel方法可以对层次化索引进行重排。
在这里插入图片描述
在这里插入图片描述
3.4.3:汇总统计
在对层次化索引的pandas数据进行汇总统计时,可以通过level参数指定在某层次上进行汇总统计。
在这里插入图片描述
3.5 pandas可视化
3.5.1:线形图
线形图通常用于描绘两组数据之间的趋势。例如,销售行中月份与销售量之间的趋势情况;金融行中股票收盘价与时间序列之间的走势。
Pandas库中的Series和DataFrame中都会有绘制各类图表的plot方法, 默认情况绘制的是线形图。
下面首先创建一个Series对象。
注意:%matplotlib inline为魔法函数,使用该函数绘制的图片会直接显示在Notebook中。
在这里插入图片描述
通过s.plot方法可以绘制线形图。从图中可以看出,Series的索引作为X轴,值为Y轴。
在这里插入图片描述
通过DataFrame数据的plot方法可以为各列绘制一条线,并会给其创建好图例。首先创建DataFrame数据。
在这里插入图片描述
绘制的图如下。
在这里插入图片描述
3.5.2:柱状图
柱状图常描绘各类别之间的关系。例如,班级中男生和女生的分布情况;某零售店各商品的购买数量分布情况。通过pandas绘制柱状图很简单,只需要在plot函数中加入kind=‘bar’,如果类别较多,可绘制水平柱状图(kind=‘barh’)。
首先,创建一个DataFrame数据的学生信息表格,如果需要分析班级的男女比例是否平衡,这时就可以使用柱状图,通过values_counts计数,获取男女计数的Series数据,进而绘制柱状图。
在这里插入图片描述
在这里插入图片描述
对于DataFrame数据而言,每一行的值会成为一组。
在这里插入图片描述
在这里插入图片描述
设置plot函数的stacked参数,可以绘制堆积柱状图。
说明:plot函数的alpha参数可设置颜色透明度。
在这里插入图片描述
3.5.3:直方图和密度图
直方图用于频率分布,y轴可为数值或者比率。直方图在统计分析中是经常使用的,绘制数据的直方图,可以看出其大概分布规律。例如,某班级的身高情况一般是服从正态分布,即高个子和矮个子的人较少,大部分都是在平均身高左右。可以通过hist方法绘制直方图。 注意:通过设置grid参数可在图表中添加网格;bins参数是将值分为多少段,默认为10。
在这里插入图片描述
核密度估计(Kernel Density Estimate,KDE)是对真实密度的估计,其过程是将数据的分布近似为一组核(如正态分布)。通过plot函数的kind=‘kde’可进行绘制。
在这里插入图片描述
3.5.4:散点图
散点图主要用来表现数据之间的规律。例如,身高和体重之间的规律。下面创建一个DataFrame数据,然后绘制散点图。
在这里插入图片描述
在这里插入图片描述
3.6 综合示例—小费数据集
3.6.1:数据分析流程
数据分析的流程通常情况下分为5步。
(1)收集数据。在这一步中,需要对收集的数据有一定的认知,对各字段的含义和背景知识都要有着足够的理解。
(2)定义问题。根据各自的行业和业务知识,对数据定义多个待解决的问题。
(3)数据清洗与整理。由于各种问题,获取的数据不够“干净”,需通过各种手段对数据进行清洗与整理,以便得到准确的分析结果。
(4)数据探索。通过可视化等手段,对数据进行分析和探索,得出结论。
(5)数据展示。这部分用于输出,或撰写数据分析报告、或汇报给上级、或绘制PPT。
3.6.2:数据来源
小费数据集来源于Python第三方库seaborn(用于绘图)中自带的数据,加载该数据集。
注意:head函数会返回前5条数据,也可指定返回数据行数。
在这里插入图片描述
该小费数据为餐饮行业收集的数据。total_bill列为消费总金额;tip列为小费金额;sex列为顾客性别;smoker列为顾客是否抽烟;day列为小费的星期;time列为聚餐的时间段;size列为聚餐人数。
3.6.3:定义问题
本次分析中,围绕小费数据集提出几个问题:小费金额与消费总金额是否存在相关性?性别、是否吸烟、星期几、中/晚餐、聚餐人数和小费金额是否有一定的关联?小费金额占消费总金额的百分比服从正态分布?
3.6.4:数据清洗
首先对数据进行简单描述,看是否有缺失值或者异常值。

在这里插入图片描述
通过结果可以看出,总共有244条数据,通过统计暂时看不出是否有缺失值。通过打印数据的info信息可以看出每列数据的类型和缺失值,本例中小费数据集没有缺失值。
注意:本例数据非常“干净”,数据清洗的内容将在后面内容中详细讲解。
在这里插入图片描述
3.6.5:数据探索
首先对小费金额与消费总金额进行分析,看看它们之间是否有关联,通过下面代码绘制散点图。
在这里插入图片描述
通过上图可以看出,小费金额与消费总金额存在着正相关的关系,即小费的金额越多,给消费也就越多,这是比较何必的。 我们再来看看性别不一样是否影响小费的金额。这里使用柱状图,通过布尔选择男女性别,对小费数据进行平均后绘制柱状图。
在这里插入图片描述
在这里插入图片描述
从柱状图中可以看出,女性小费金额少于男性小费金额。
其他字段与小费的关系也是类似的方法。例如,日期与小费的关系,由于观察数据时只看到了前5行数据,通过unique函数看下日期的唯一值有哪些。
在这里插入图片描述
日期平均小费柱状图如下所示,周六、周日的小费比周四、周五的小费高。
最后我们一起来分析一下小费百分比的分布情况,这里的消费总金额为小费金额和聚餐所花费的金额( total_bill),通过DataFrame算术运算,新建一列,用于存储小费百分比。
在这里插入图片描述
直方图如下所示,可以看出基本上符合正态分布,但也有几个异常点。
在这里插入图片描述
本章总结
本章主要讲解了:创建Series和DataFrame数据结构,两种数据结构索引方法和数据选取、运算和函数应用,层次化索引,pandas可视化,最后结合前面所学知识,讲解了综合示例—小费数据集。
通过本章学习,希望同学们能够掌握Series和DataFrame两种数据结构的创建、索引方法、数据选取、运算和函数的应用,能够创建和使用层次化索引,了解pandas可视化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我菜的要死

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值