pandas,python+data+analysis的组合缩写,是python中基于numpy和matplotlib的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包,享有数分三剑客之名。
正因为pandas是在numpy基础上实现,其核心数据结构与numpy的ndarray十分相似,但pandas与numpy的关系不是替代,而是互为补充。二者之间主要区别是:从数据结构上看:
numpy的核心数据结构是ndarray,支持任意维数的数组,但要求单个数组内所有数据是同质的,即类型必须相同;而pandas的核心数据结构是series和dataframe,仅支持一维和二维数据,但数据内部可以是异构数据,仅要求同列数据类型一致即可
从功能定位上看:
numpy虽然也支持字符串等其他数据类型,但仍然主要是用于数值计算,尤其是内部集成了大量矩阵计算模块,例如基本的矩阵运算、线性代数、fft、生成随机数等,支持灵活的广播机制
pandas主要用于数据处理与分析,支持包括数据读写、数值计算、数据处理、数据分析和数据可视化全套流程操作
02 数据结构 pandas核心数据结构有两种,即一维的series和二维的dataframe,二者可以分别看做是在numpy一维数组和二维数组的基础上增加了相应的标签信息。正因如此,可以从两个角度理解series和dataframe:
series和dataframe分别是一维和二维数组,因为是数组,所以numpy中关于数组的用法基本可以直接应用到这两个数据结构,包括数据创建、切片访问、通函数、广播机制等
series是带标签的一维数组,所以还可以看做是类字典结构:标签是key,取值是value;而dataframe则可以看做是嵌套字典结构,其中列名是key,每一列的series是value。所以从这个角度讲,pandas数据创建的一种灵活方式就是通过字典或者嵌套字典,同时也自然衍生出了适用于series和dataframe的类似字典访问的接口,即通过loc索引访问。
考虑series和dataframe兼具numpy数组和字典的特性,那么就不难理解二者的以下属性:注意,这里强调series和dataframe是一个类字典结构而非真正意义上的字典,原因在于series中允许标签名重复、dataframe中则允许列名和标签名均有重复,而这是一个真正字典所不允许的。
ndim/shape/dtypes/size/T,分别表示了数据的维数、形状、数据类型和元素个数以及转置结果。其中,由于pandas允许数据类型是异构的,各列之间可能含有多种不同的数据类型,所以dtype取其复数形式dtypes。与此同时,series因为只有一列,所以数据类型自然也就只有一种,pandas为了兼容二者,series的数据类型属性既可以用dtype也可以用dtypes获取;而dataframe则只能用dtypes。
index/columns/values,分别对应了行标签、列标签和数据,其中数据就是一个格式向上兼容所有列数据类型的array。为了沿袭字典中的访问习惯,还可以用keys()访问标签信息,在series返回index标签,在dataframe中则返回columns列名;可以用items()访问键值对,但一般用处不大。
关于series和dataframe数据结构本身,有大量的方法可用于重构结构信息:
rename,可以对标签名重命名,也可以重置index和columns的部分标签列信息,接收标量(用于对标签名重命名)或字典(用于重命名行标签和列标签)
reindex,接收一个新的序列与已有标签列匹配,当原标签列中不存在相应信息时,填充NAN或者可选的填充值
set_index/reset_index,互为逆操作,前者是将已有的一列信息设置为标签列,而后者是将原标签列归为数据,并重置为默认数字标签
set_axis,设置标签列,一次只能设置一列信息,与rename功能相近,但接收参数为一个序列更改全部标签列信息(rename中是接收字典,允许只更改部分信息)
在pandas早些版本中,除一维数据结构series和二维数据结构dataframe外,还支持三维数据结构panel。这三者是构成递进包容关系,panel即是dataframe的容器,用于存储多个dataframe。2019年7月,随着pandas 0.25版本的推出,pandas团队宣布正式弃用panel数据结构,而相应功能建议由多层索引实现。
也正因为pandas这3种独特的数据结构,个人一度认为pandas包名解释为:pandas = panel +dataframe + series,根据维数取相应的首字母个数,从而构成pandas,这是个人非常喜欢的一种关于pandas缩写的解释。
03 数据读写 pandas支持大部分的主流文件格式进行数据读写,常用格式及接口为:
文本文件,主要包括csv和txt两种等,相应接口为read_csv()和to_csv(),分别用于读写数据
Excel文件,包括xls和xlsx两种格式均得到支持,底层是调用了xlwt和xlrd进行excel文件操作,相应接口为read_excel()和to_excel()
SQL文件,支持大部分主流关系型数据库,例如MySQL,需要相应的数据库模块支持,相应接口为read_sql()和to_sql()
此外,pandas还支持html、json等文件格式的读写操作。
04 数据访问
series和dataframe兼具numpy数组和字典的结构特性,所以数据访问都是从这两方面入手。同时,也支持bool索引进行数据访问和筛选。
[ ],这是一个非常便捷的访问方式,不过需区分series和dataframe两种数据结构理解:
series:既可以用标签也可以用数字索引访问单个元素,还可以用相应的切片访问多个值,因为只有一维信息,自然毫无悬念
切片形式返回行查询,且为范围查询
切片类型与索引列类型不一致时,引发报错
where,仍然是执行条件查询,但会返回全部结果,只是将不满足匹配条件的结果赋值为NaN或其他指定值,可用于筛选或屏蔽值
pandas中支持大量的数据访问接口,但万变不离其宗:只要联想两种数据结构兼具numpy数组和字典的双重特性,就不难理解这些数据访问的逻辑原理。当然,重点还是掌握[]、loc和iloc三种方法。
loc和iloc应该理解为是series和dataframe的属性而非函数,应用loc和iloc进行数据访问就是根据属性值访问的过程
另外,在pandas早些版本中,还存在loc和iloc的兼容结构,即ix,可混合使用标签和数字索引,但往往容易混乱,所以现已弃用
05 数据处理
pandas最为强大的功能当然是数据处理和分析,可独立完成数据分析前的绝大部分数据预处理需求。简单归纳来看,主要可分为以下几个方面:
1.数据清洗
数据处理中的清洗工作主要包括对空值、重复值和异常值的处理:删除空值,dropna,删除存在空值的整行或整列,可通过axis设置,也包括inplace参数
删除重复值,drop_duplicates,按行检测并删除重复的记录,也可通过keep参数设置保留项。由于该方法默认是按行进行检测,如果存在某个需要需要按列删除,则可以先转置再执行该方法
2.数值计算
由于pandas是在numpy的基础上实现的,所以numpy的常用数值计算操作在pandas中也适用:
需注意的是,这里的字符串接口与python中普通字符串的接口形式上很是相近,但二者是不一样的。
3.数据转换
前文提到,在处理特定值时可用replace对每个元素执行相同的操作,然而replace一般仅能用于简单的替换操作,所以pandas还提供了更为强大的数据转换方法
4.合并与拼接
pandas中又一个重量级数据处理功能是对多个dataframe进行合并与拼接,对应SQL中两个非常重要的操作:union和join。pandas完成这两个功能主要依赖以下函数:
concat,与numpy中的concatenate类似,但功能更为强大,可通过一个axis参数设置是横向或者拼接,要求非拼接轴向标签唯一(例如沿着行进行拼接时,要求每个df内部列名是唯一的,但两个df间可以重复,毕竟有相同列才有拼接的实际意义)
merge,完全类似于SQL中的join语法,仅支持横向拼接,通过设置连接字段,实现对同一记录的不同列信息连接,支持inner、left、right和outer4种连接方式,但只能实现SQL中的等值连接
join,语法和功能与merge一致,不同的是merge既可以用pandas接口调用,也可以用dataframe对象接口调用,而join则只适用于dataframe对象接口
append,concat执行axis=0时的一个简化接口,类似列表的append函数一样
建表语句
通过设置参数,concat和merge实现相同效果
06 数据分析
pandas中的另一大类功能是数据分析,通过丰富的接口,可实现大量的统计需求,包括Excel和SQL中的大部分分析过程,在pandas中均可以实现。
1.基本统计量
pandas内置了丰富的统计接口,这是与numpy是一致的,同时又包括一些常用统计信息的集成接口。
info,展示行标签、列标签、以及各列基本信息,包括元素个数和非空个数及数据类型等
head/tail,从头/尾抽样指定条数记录
2.分组聚合
pandas的另一个强大的数据分析功能是分组聚合以及数据透视表,前者堪比SQL中的groupby,后者媲美Excel中的数据透视表。pandas官网关于groupby过程的解释
级联其他聚合函数的方式一般有两种:单一的聚合需求用groupby+聚合函数即可,复杂的大量聚合则可借用agg函数,agg函数接受多种参数形式作为聚合函数,功能更为强大。两种分组聚合形式
另外,还有一对函数也常用于数据重整,即stack和unstack,其中unstack执行效果与pivot非常类似,而stack则是unstack的逆过程。
07 数据可视化
pandas集成了matplotlib中的常用可视化图形接口,可通过series和dataframe两种数据结构面向对象的接口方式简单调用。关于面向对象接口和plt接口绘图方式的区别,可参考python数据科学系列:matplotlib入门详细教程。
两种数据结构作图,区别仅在于series是绘制单个图形,而dataframe则是绘制一组图形,且在dataframe绘图结果中以列名为标签自动添加legend。另外,均支持两种形式的绘图接口:plot()方法并通过传入kind参数选择相应绘图类型,如plot(kind='bar')
不过,pandas绘图中仅集成了常用的图表接口,更多复杂的绘图需求往往还需依赖matplotlib或者其他可视化库。
纯洁的微笑博客:http://www.ityouknow.com/python.html