![大数据分析与应用实战:统计机器学习之数据导向编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/943/44509943/b_44509943.jpg)
1.4.2 Python语言衍生数据对象取值
如前所述,Python最重要的衍生数据对象当属numpy模块中的n维数组ndarray结构对象,以及pandas模块中的二维DataFrame结构对象。取值工作首先要了解Python语言的索引编号规则,图1.8显示前向索引编号从0开始,后向索引编号的负号(-)表示倒数,此点与R语言取值的负索引删除之意不同 。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P76_3368.jpg?sign=1739447364-DWjwNQ2Y8rI3paSPhP80IzsRWSg444eB-0-086b3e3b16a19f5f41669e5f9338b312)
图1.8 Python语言前向与后向索引编号示意图
numpy模块的n维数组ndarray取值方式类似R语言,首先使用np.arange()函数产生20个整数值,将其排列成4行5列的二维矩阵data。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P76_19890.jpg?sign=1739447364-zU1DaA4ceAgrQEMiVi2OVIQqOqvZyQDj-0-47cd4c9e64965f0c58df92fc4b9d72b4)
Python语言取值以冒号运算符:分隔起始索引、终止索引与索引增量,形如(start:stop:step),起始与终止编号的取值规则是前包后不包,最后一个索引增量值默认为1,所以通常省略。假设对象data前四列是属性变量,最末列是反应变量,我们以numpy ndarray的取值语法分割属性矩阵与反应变量,二维取值以逗号,分隔行列各自的冒号运算符语法,各维全取时仍须键入冒号,而非R语言的空白。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P77_19892.jpg?sign=1739447364-UrL67I44Eoz1Z9b2gtBGsskCUJyBIe9Z-0-de75313c26e1d68788dcbb836ad884bd)
二维data仍然可视为一维的结构进行取值,读者请注意终止索引被省略的含义(取到最后一个),以及负索引与间距的应用。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P78_20090.jpg?sign=1739447364-BZcJ48rjsqDb1CZOM71F00qW5STCUhzv-0-85d6236d30793c944e150b283bec90f1)
接下来说明初学者相当困扰的pandas二维DataFrame各种取值方法,先使用pandas模块的Excel读文件函数read_excel()读入Facebook打卡数据:
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P78_20091.jpg?sign=1739447364-uisGc3JQ5SR4Zy6ivWdH6UdXtZeOEUDY-0-4234ae76af264b79d7663b3951c80f63)
类别type()确认数据对象fb的类别,dir()函数查询pandas数据集对象可用属性与方法。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P78_20092.jpg?sign=1739447364-uGmDbNjBMH8zjng4b8PutsC6IuYxK4gh-0-32af82277c304a611e3963a22a8eecc2)
运用前述Python句点语法,查看各字段数据类型,其中int是整数变量,float是浮点数变量,而类别与地区两字段的object表示字符串。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P78_19893.jpg?sign=1739447364-GfRLvAUy8pnmbOdKRSWkei6ra6yg8vGq-0-dd334f6ab9fcc70a38bf63f97935f6c4)
Python套件pandas也有head()方法,默认可以显示前五笔数据。在此我们粗浅地比较Python与R语法的差异:R语言的泛函式编程语法倾向将数据对象传入函数中,如head(fb);而Python语言大多用面向对象句点语法(虽然Python也融入了泛函式编程的范式,参见1.6节编程范式与面向对象概念),对象名后接属性或方法,例如此处的fb.head()。两者输入参数值的方式是相同的,例如head(fb, n=4)与fb.head(n=4)。读者如能掌握R与Python前述语法上的差异,从数据驱动程序设计的角度理解代码,可以加快掌握两大工具的学习过程。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P79_19894.jpg?sign=1739447364-y4lBZ9P4LhqtCm0Ez615F4bE5cNhxEyx-0-18c9759c7ebd03e21af3b09bf0b3e25d)
pandas数据集取值第一种方法是以中括号加上属性名称取出整列(注:R语言数据集大多也是用中括号取值),请注意一对中括号与两对中括号的差异,此点与1.3.7节提及的R语言列表对象两对中括号[[]]与一对中括号[]的取值差异类似。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P80_19895.jpg?sign=1739447364-Llxp4sBHCn70zfK2bWoZNFX0HElQllA8-0-4e6a3ce5f8c73a5aa08c5ab136dfb48f)
第二种方法以Python的句点语法,后接DataFrame的属性取出整列。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P80_19897.jpg?sign=1739447364-HSnsYQW5VqOOv5FK4rUo2HNfCRaYtcWN-0-bdf68ca5682382d9b0563158ec633ec0)
第三种方法通过DataFrame的loc()方法取值,可以对行列进行限制,不过必须使用列名进行索引(label-based indexing)。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P81_19898.jpg?sign=1739447364-uyj8d74BXsi8T4xrWd1jq6G0YCUasw5l-0-dab5dfb258399e9f241ead22c05cda3a)
第四种方法通过iloc()方法取值,类似loc()方法也可以对行列进行限制,不过必须使用位置索引(positional indexing),也就是用变量编号而非变量名称了。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P81_19899.jpg?sign=1739447364-YuFYcGJ4xtz5vErpuBACJy8gx5lY6kPF-0-5fea6c0a10bbf0d86c6ece1b5971b79c)
过去pandas数据集有一种通过ix()方法取值的方式,允许交替使用列名与列索引。不过新版的pandas套件已经宣布未来不支持ix()的取值方法,这也是使用开放源码软件须留意诸多套件改版信息的原因了。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P81_3579.jpg?sign=1739447364-wYRTyfLybp7nnJVofuGxGBLhEtQvG0hL-0-553d2388d87e2615103a81b639fec58d)
总结来说,pandas的数据集整列选取可以使用第一种、第二种方法,后两种方法(loc()与iloc())适合做多条件的弹性数据选取。提醒读者:Python是计算机科学家开发出来的语言,其数据对象相比数学与统计驱动的R语言相对简单但是功能强大,虽然R语言的前身S语言也是四十多年前源自通信、计算机操作系统与程序语言的重要研发机构之一——贝尔实验室。无论学习何种程序语言,精通该语言数据对象的使用是成为熟练程序员的关键第一步。