![Python人工智能](https://wfqqreader-1252317822.image.myqcloud.com/cover/801/40107801/b_40107801.jpg)
2.1 Pandas科学计算库
在数据分析工作中,Pandas的使用频率是很高的。一方面是因为Pandas提供的基础数据结构DataFrame与JSON的契合度很高,转换起来很方便。另一方面,如果我们日常的数据清理工作不是很复杂的话,则使用Pandas代码就可以很方便地对数据进行规整。
2.1.1 初识Pandas
Pandas由AQR Capital Management于2008年开发,并于2009年年底开源发布,目前由专注于Python数据包开发的PyData开发团队继续开发和维护。
Pandas是基于NumPy构建的含有更高级数据结构和分析能力的工具包。Pandas的核心数据结构是Series和DataFrame,它们分别代表着一维的序列和二维的表结构。基于这两种数据结构,Pandas可以对数据进行导入、清洗、处理、统计和输出。它是支撑Python成为强大而高效的科学计算语言的重要因素之一。
由于Pandas是Python的第三方库,需要另外安装:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-043-1.jpg?sign=1739288385-Hwfq6TYUourWPU54XD7lDWAKzCwYmBq4-0-91ee39371e4b02e7e078d79797cf9373)
安装完成后,我们来查看Pandas版本,代码如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-043-2.jpg?sign=1739288385-BWt1zxCW2GRiHXW0X9l6OVjVtfucTkDw-0-895da792dc8d13bf7f2f1dc170181902)
下面我们通过一个例子来体验Pandas的操作,感受它的科学计算能力。
【例2-1】 Pandas基本操作。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-043-3.jpg?sign=1739288385-npdJRlmI1g8kIbaXZTFqhmCmBzMcThyj-0-38575f6aaf2f45a3758807c6cb02b1dc)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-044-1.jpg?sign=1739288385-bG92LSHtCc7gXkcQ8BMlWKzTeLul71Pj-0-7a9473ccaef4fa5aa740fec35dac0bfc)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-044-2.jpg?sign=1739288385-tGjHjg0lIvZzhev6WJ1aaFfHUw93kMCJ-0-3d52c732b382a18519e996f827659c9b)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-045-1.jpg?sign=1739288385-E28umuOXRc1PuJo2OlRza1gODqCqJswE-0-eaa6c41f227d5b6c05ef8df57a9391d6)
在例2-1中,利用NumPy构建了一个Pandas库下的DataFrame对象,并对其进行了一些基本操作,以方便读者对Pandas进行理解。由结果可看出,Pandas在数据预处理与数据挖掘过程中起着非常重要的作用。
2.1.2 Pandas的相关操作
1. 数据结构
目前,Pandas中的数据结构有3种,分别为Series、DataFrame和Panel,如表2-1所示。
表2-1 Pandas中的3种数据结构
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-045-2.jpg?sign=1739288385-qsyMzD98kWbmBorf4UpWJ5SkPJxlJuKg-0-3f1a437a682bf97981a66c37c0c8f83b)
2. Series结构
Series是Pandas中最基本的对象,它定义了NumPy的ndarry对象的接口array(),因此可以利用NumPy的数组处理函数直接处理Series对象。一个Series是一个一维的数据对象,其中每一个元素都有一个标签,标签可以是数字或字符串。Series对象具有列表和字典的属性(字典的属性由索引赋予)。
Series的基本创建方式为:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-046-1.jpg?sign=1739288385-vsXES4CRZtq8uNauDXqMzAbvNAvOJMBm-0-7853286ab39f3c7a5c7cbadbc278e15e)
其中:
• data:传入数据,可以传入多种类型。
• index:索引,在不指定index的情况下,默认数值索引range(0,len(data))。
【例2-2】 创建Series。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-046-2.jpg?sign=1739288385-6Q8aWbsx1eirKXTauBeED99e485shCuI-0-f09a61c736e7fc34ae94d1a6f8e5b832)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-046-3.jpg?sign=1739288385-dxhgpbSt2mYujPBcCt6T6rWy0fXHDASq-0-78948fe7aa713ead6081c405ade9bb05)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-047-1.jpg?sign=1739288385-vVDzcN9Vff0novdI2DgjKrfkfpCLT7Rq-0-f714e902bfac84024231da4daa2b231d)
3. DataFrame结构
DataFrame(数据框)是表格型的二维数据结构,特点如下。
• 列内的元素同类型,不同的列之间可以不相同。
• 索引有两个轴向:axis=0或'index'行,axis=1或'columns'列。分别用df.index(行名)与df.columns(列名)调用。
在数据处理中,使用数据框是非常便捷的;而系列(Series)我们却很少使用。DataFrame的基本创建方式为:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-047-2.jpg?sign=1739288385-3T5CJq2QNrGv8LzEgxGxC0lCiPHUuwJ0-0-3a1399d22c390b59f6e61d137a030ffc)
• data:传入数据,可以传入多种类型数据。
• index:列索引,不指定自动数值索引填充。
• columns:行索引,不指定自动数值索引填充。
【例2-3】 创建DataFrame。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-047-3.jpg?sign=1739288385-23dnuN09lLfWgRIxfwGAfBiGPmc2keUD-0-f0fdecb545acca87909df2f3bdad7909)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-048-1.jpg?sign=1739288385-7iUAE71eEtjw9rMsqr3X2Vi8mbyl4lgl-0-b473d459f5fecd54efa33a10548defc7)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-048-2.jpg?sign=1739288385-o1uE26uCVnhaJJmHNc9GMwRUz4KgrSEM-0-94dd977c2f9e915fe27d9872bfe24170)
还可以使用字典创建DataFrame。例如:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-048-4.jpg?sign=1739288385-8VdqqyPtfzYB9oZf1hcHSnpDzdIA3CpE-0-3db59bf506d2eb9075b72eaeef15213a)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-048-5.jpg?sign=1739288385-ckbWiKd8VNwGJJq9innip5EWWUo9VJOk-0-c2c5631612816c75fd7386d31de8e770)
4. Panel结构
Panel创建的是三维的表,其创建方式为:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-049-1.jpg?sign=1739288385-Lj8A9E5GVBpeEFpvc4iPs5YTVpssz5nk-0-c6c9535c16417b529dc6cad523e93eb1)
其中:
• items:坐标轴0,索引对应的元素是一个DataFrame。
• major_axis:坐标轴1,DataFrame里的行标签。
• minor_axis:坐标轴2,DataFrame里的列标签。
【例2-4】 创建三维数组,分别对应相应的item、major_axis和minor_axis。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-049-2.jpg?sign=1739288385-BRZjXg6O5pctlgZ3IvaKfJo9BsHxPaOy-0-690576f7e9fec96db91039d06ae966a8)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-049-3.jpg?sign=1739288385-xuXS9xxTRLSe91gpavcAsuHWT7W69H1N-0-6e33e59ccf0b34b7dada36f9f3bbbf8c)
通过前面的介绍,可以初步了解Pandas在内存中的基本操作。需要注意,数据的行列信息(index、columns)。同时Pandas也支持本地读取文件,如pd.to_csv读取csv文件等,具体如表2-2所示。
表2-2 Pandas读取文件
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-050-2.jpg?sign=1739288385-rmvFIwo9fNQKO6NgJDJeLFeSoh4rnXkS-0-334c6719f50e2563fd104adc7a02fb5d)
5. 数据的选取与清洗
对DataFrame进行选择,要从3个层次考虑:行列、区域和单元格。
(1)使用方括号[]选取行列。
使用方括号[]选取,返回的是一维数组——行维度。输入要求是整数切片、标签切片、布尔数组,具体规则如表2-3所示。
表2-3 使用方括号[]选取行列规则
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-050-3.jpg?sign=1739288385-zCicgoumWlWNw7gGIvI3jxICNSWNhNsD-0-5c9e97caeed073dd036fd06e0f819010)
(2)df.loc[]用于标签定位,[]内为行和列的名称,下面直接通过一个例子来演示其用法。
【例2-5】 df.loc[]的用法。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-051-1.jpg?sign=1739288385-QGp1VFc2v1CZzMQ45Nrf6ciRyBGqcsk2-0-bb21d4bd4a4f30c9475c159302c9b852)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-051-2.jpg?sign=1739288385-hNaQ8UJ4rYZvSbW7iFa0iKwpLXS1cpnc-0-4781287beda62334caadab8c3018f96f)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-052-1.jpg?sign=1739288385-Hs0o6DjUMJJ9SVwbLO2U6YsAU006SUOA-0-ad69f8a9ec83525e36738f7558e0e23c)
当然,获取某列数据最直接的方式是df.[列标签],但是当列标签未知时可以通过这种方式获取列数据。
需要注意的是,dataframe的索引[1:3]是包含1、2、3的,与平时的不同。
(3)df.iloc[]可通过行号获取行数据。下面通过一个例子来演示其用法。
【例2-6】 df.iloc[]的用法。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-052-2.jpg?sign=1739288385-mvfDfpe6kP3ezkA56WPWA49PpdUMIOXb-0-79063f112528e856e9c3d1098b9d2c53)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-052-3.jpg?sign=1739288385-SEUXTH5u332YZRp0rfKcAHE0odDx39be-0-8687b0e4e8c2fe2f975b7d006a1c082b)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-053-1.jpg?sign=1739288385-vrIU590RQXPEjTp2VVhPNvquDPAI3ntj-0-6e6cb7a0b19d4e6bca1edd6be4935afe)
(4)df.ix[]是iloc和loc的合体。下面通过一个例子来演示其用法。
【例2-7】 df.ix[]的用法。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-053-2.jpg?sign=1739288385-xmSa6Fo5ZTwLXnzvk3okcvSiBRNzCOd4-0-794800de23205745d8fddedaec7efaab)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-053-3.jpg?sign=1739288385-OEJJBsWYCESlOSsSp2xAOYAr7swcPrtr-0-87fe8b65f477462cd5ef480b7324b57e)
6. 数据清洗
无论是数据挖掘工程师、机器学习工程师,还是深度学习工程师,都非常了解数据真实性的重要性,数据真实性决定特征维度的选择规则。数据准备阶段(包含数据的抽取、清洗、转换和集成)的工作量常常占据全部工作的50%左右。而在数据准备的过程中,数据质量差又是最常见而且最令人头痛的问题之一。本节针对缺失值和特殊值这种数据质量问题提出了推荐的处理方法。
【例2-8】 构建DataFrame。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-053-4.jpg?sign=1739288385-LzM4V6CVayN2oM6LNMu5mjfe0Ejjf9zP-0-1e0afeb2f19cec0b48e346bfc713b22f)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-054-1.jpg?sign=1739288385-mCSy8wNLv8fYtye0i2PwL824IIK1CzSq-0-922c98ad97bc2bb539f1f84eb59ece14)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-054-2.jpg?sign=1739288385-oUQ2ikHkuBZNtW8DNtlVna53D8pTidtz-0-250534f872d897e07107e31c4935ed6b)
利用dropna()可以实现对缺失值的处理,下面的代码实现了对df2缺失值的处理:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-054-3.jpg?sign=1739288385-36g2neVBhHy1iEW71ND3rXDmiZfnBgaK-0-64c6c15d9c58399e3c251f19da935e2b)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-055-1.jpg?sign=1739288385-JrBbGaQdBgBNdpPEeLrCGtQDpG4DM18M-0-4ec0f3bcf674b3bddc954fb4580f5380)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-056-1.jpg?sign=1739288385-pK6Akiw7IKycOaxcMPh2YAIE9VrNIhm7-0-2421ad9d489561930fd5e8917549a1c8)
可用的填充方法如表2-4所示。
表2-4 可用的填充方法
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-056-2.jpg?sign=1739288385-JiLx1kV5Uyok5vqejdfTfCZJQ6SKCCp0-0-2853e754cb94917221187c7f2f631ee0)
注意:处理时间序列数据,使用pad/ffill十分常见,因此“最后已知值”在每个时间点都可用。ffill()等效于fillna(method= 'ffill'),bfill()等效于fillna(method= 'bfill')。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-056-3.jpg?sign=1739288385-FEee2VUe66VxMt73tsROGKuLQkX6pBYJ-0-4c61fce01c554cd51b71a3b4886e66e7)
通常我们想用其他值替换任意值。在Series/DataFrame中可以使用replace(),它提供了一种高效而灵活的方法来执行此类替换。
【例2-9】 利用replace()对例2-8中的数据进行替换。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-056-4.jpg?sign=1739288385-t5Pc2V6jCbGfDFTpXSs7Jjsj5ENgOtCT-0-6499a561c313cc17d41192359a9793f4)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-057-1.jpg?sign=1739288385-cLZdg2AjZQNuiAx5n1hobztSxbiF2Rwe-0-94a2fd0ba0d84ee82b57b92ca94af4ee)
通常,在数据预处理时,如果数据特征维度比较大,则我们会丢弃一些弱特征。如果在DataFrame中需要标识和删除重复行,那么有两种有效的方法:duplicated和drop_duplicates。每种方法都将以标识重复行的列作为参数。
• duplicated:返回布尔向量,其长度为行数,并指示行是否重复。
• drop_duplicates:删除重复的行。
在默认情况下,重复集的第一个观察到的行被认为是唯一的,但每个方法都有一个keep参数来指定要保留的目标。
• kepp='first'(默认):除第一次出现外,标记/删除重复项。
• kepp='last':标记/删除除了最后一次出现的副本。
• kepp='False':标记/删除重复项。
【例2-10】 对例2-8中的数据进行标识和删除重复行。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-058-1.jpg?sign=1739288385-wnD6AyNIBlJFPcUnegDt2Xi5XP5r8Yu7-0-737d1904c40ffd921b58435eb9481d59)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-059-1.jpg?sign=1739288385-10LgUwI44qNFOUeAsB46iv4BBqSUtky7-0-7a4b821dadbf839abdfab3c4889b240e)