![1d2208f1cb5d46b6492a2920c4268075.png](https://i-blog.csdnimg.cn/blog_migrate/078b5e3e67568b8541a9bd4764479a78.jpeg)
行文二级目录
01 关于pandas
![64ead9f4dcdaa611a6d2cfd7fb88584f.png](https://i-blog.csdnimg.cn/blog_migrate/7f88c6d485258406abdfcb7bb28a8e16.jpeg)
pandas,python+data+analysis的组合缩写,是python中基于numpy和matplotlib的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包,享有数分三剑客之名。
正因为pandas是在numpy基础上实现,其核心数据结构与numpy的ndarray十分相似,但pandas与numpy的关系不是替代,而是互为补充。二者之间主要区别是:
- 从数据结构上看:
- numpy的核心数据结构是ndarray,支持任意维数的数组,但要求单个数组内所有数据是同质的,即类型必须相同;而pandas的核心数据结构是series和dataframe,仅支持一维和二维数据,但数据内部可以是异构数据,仅要求同列数据类型一致即可
- numpy的数据结构仅支持数字索引,而pandas数据结构则同时支持数字索引和标签索引
- 从功能定位上看:
- numpy虽然也支持字符串等其他数据类型,但仍然主要是用于数值计算,尤其是内部集成了大量矩阵计算模块,例如基本的矩阵运算、线性代数、fft、生成随机数等,支持灵活的广播机制
- pandas主要用于数据处理与分析,支持包括数据读写、数值计算、数据处理、数据分析和数据可视化全套流程操作
pandas主要面向数据处理与分析,主要具有以下功能特色:
- 按索引匹配的广播机制,这里的广播机制与numpy广播机制还有很大不同
- 便捷的数据读写操作,相比于numpy仅支持数字索引,pandas的两种数据结构均支持标签索引,包括bool索引也是支持的
- 类比SQL的join和groupby功能,pandas可以很容易实现SQL这两个核心功能,实际上,SQL的绝大部分DQL和DML操作在pandas中都可以实现
- 类比Excel的数据透视表功能,Excel中最为强大的数据分析工具之一是数据透视表,这在pandas中也可轻松实现
- 自带正则表达式的字符串向量化操作,对pandas中的一列字符串进行通函数操作,而且自带正则表达式的大部分接口
- 丰富的时间序列向量化处理接口
- 常用的数据分析与统计功能,包括基本统计量、分组统计分析等
- 集成matplotlib的常用可视化接口,无论是series还是dataframe,均支持面向对象的绘图接口
正是由于具有这些强大的数据分析与处理能力,pandas还有数据处理中"瑞士军刀"的美名。
02 数据结构
![9d89f24f76d257c09c306ea61bf03e08.png](https://i-blog.csdnimg.cn/blog_migrate/072a44241ef064c09e871d284f7907fd.jpeg)
pandas核心数据结构有两种,即一维的series和二维的dataframe,二者可以分别看做是在numpy一维数组和二维数组的基础上增加了相应的标签信息。正因如此,可以从两个角度理解series和dataframe:
- series和dataframe分别是一维和二维数组,因为是数组,所以numpy中关于数组的用法基本可以直接应用到这两个数据结构,包括数据创建、切片访问、通函数、广播机制等
- series是带标签的一维数组,所以还可以看做是类字典结构:标签是key,取值是value;而dataframe则可以看做是嵌套字典结构,其中列名是key,每一列的series是value。所以从这个角度讲,pandas数据创建的一种灵活方式就是通过字典或者嵌套字典,同时也自然衍生出了适用于series和dataframe的类似字典访问的接口,即通过loc索引访问。
注意,这里强调series和dataframe是一个类字典结构而非真正意义上的字典,原因在于series中允许标签名重复、dataframe中则允许列名和标签名均有重复,而这是一个真正字典所不允许的。
考虑series和dataframe兼具numpy数组和字典的特性,那么就不难理解二者的以下属性:
- 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()访问键值对,但一般用处不大。
这里提到了index和columns分别代表行标签和列标签,就不得不提到pandas中的另一个数据结构:Index,例如series中标签列、dataframe中行标签和列标签均属于这种数据结构。既然是数据结构,就必然有数据类型dtype属性,例如数值型、字符串型或时间类型等,其类型绝大多数场合并不是我们关注的主体,但有些时候值得注意,如后文中提到的通过[ ]执行标签切片访问行的过程。此外,index数据结构还有名字属性name(默认为None)、形状属性shape等。
![6ff374df88570936e187d19964ab6c20.png](https://i-blog.csdnimg.cn/blog_migrate/36fb73da1d702d7253055856f3b7dbbc.jpeg)
关于serie