![大数据分析与应用实战:统计机器学习之数据导向编程](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=1739500904-k1x36lcfDwUBTmPfUWk7rOTKQy8SmDHD-0-54c4066607a8febffe712e808180f64d)
图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=1739500904-9Id3yV5fPQAl8VEHs4oNgno2HnW5cNRL-0-15c16e2e670f9c280834d900dbd270c1)
Python语言取值以冒号运算符:分隔起始索引、终止索引与索引增量,形如(start:stop:step),起始与终止编号的取值规则是前包后不包,最后一个索引增量值默认为1,所以通常省略。假设对象data前四列是属性变量,最末列是反应变量,我们以numpy ndarray的取值语法分割属性矩阵与反应变量,二维取值以逗号,分隔行列各自的冒号运算符语法,各维全取时仍须键入冒号,而非R语言的空白。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P77_19892.jpg?sign=1739500904-MWv7B82LGeyN2DCuCJHkhXPpF0hW7XFj-0-e17d5fbbafa2e86308c0681ba4341ea2)
二维data仍然可视为一维的结构进行取值,读者请注意终止索引被省略的含义(取到最后一个),以及负索引与间距的应用。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P78_20090.jpg?sign=1739500904-tguBXOqQ0QLI5T25pi44trAO3RpVn4bk-0-c46054934cc9d554f1be2540a39561b1)
接下来说明初学者相当困扰的pandas二维DataFrame各种取值方法,先使用pandas模块的Excel读文件函数read_excel()读入Facebook打卡数据:
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P78_20091.jpg?sign=1739500904-NRX4TxiDkhmouoWZvMnkbhghZfSaqo73-0-26cb4eecc5aefe652ef99aeeb589b4ec)
类别type()确认数据对象fb的类别,dir()函数查询pandas数据集对象可用属性与方法。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P78_20092.jpg?sign=1739500904-Zr6XRej8Zgu2JDgWRQoJG5USW8POK5zL-0-6b9c7f0e688469cacaecfebfdeef5547)
运用前述Python句点语法,查看各字段数据类型,其中int是整数变量,float是浮点数变量,而类别与地区两字段的object表示字符串。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P78_19893.jpg?sign=1739500904-IYbhO6mZNxVQCU4JZDwocFGdCCFeiwro-0-9e006f356f7fdaaf71d30c22a1c14b1a)
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=1739500904-EpeghmRPm4TYDeWSQlAPeK6ExXW1ULNH-0-ae8f14bd989d05b188d42606c1be2dec)
pandas数据集取值第一种方法是以中括号加上属性名称取出整列(注:R语言数据集大多也是用中括号取值),请注意一对中括号与两对中括号的差异,此点与1.3.7节提及的R语言列表对象两对中括号[[]]与一对中括号[]的取值差异类似。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P80_19895.jpg?sign=1739500904-s3xScTeo7CMiiVMFQb3sb2hxAbHdD0hv-0-8b06c6aedd01c41c78a3ae0661864b51)
第二种方法以Python的句点语法,后接DataFrame的属性取出整列。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P80_19897.jpg?sign=1739500904-Puos9mN77Ux19O25TDLiwQbmtSPUIxnU-0-9e9aa65b03da7a425059a2f1c53dc1e3)
第三种方法通过DataFrame的loc()方法取值,可以对行列进行限制,不过必须使用列名进行索引(label-based indexing)。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P81_19898.jpg?sign=1739500904-9YLvFyjWTQim9miEKOvhBqXfl8H6CKGn-0-14037cdf01eb10958a175a92b3a041f0)
第四种方法通过iloc()方法取值,类似loc()方法也可以对行列进行限制,不过必须使用位置索引(positional indexing),也就是用变量编号而非变量名称了。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P81_19899.jpg?sign=1739500904-ZFF38qsvlhOURwMtwnXhRUdcTOUlEjea-0-d29cbaf41967973e118ee743a25d5b54)
过去pandas数据集有一种通过ix()方法取值的方式,允许交替使用列名与列索引。不过新版的pandas套件已经宣布未来不支持ix()的取值方法,这也是使用开放源码软件须留意诸多套件改版信息的原因了。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P81_3579.jpg?sign=1739500904-VzSKAhgLd6sDoZgff1RZiJryvS5cZpLK-0-c067665241aaca73bba63a341d02bcab)
总结来说,pandas的数据集整列选取可以使用第一种、第二种方法,后两种方法(loc()与iloc())适合做多条件的弹性数据选取。提醒读者:Python是计算机科学家开发出来的语言,其数据对象相比数学与统计驱动的R语言相对简单但是功能强大,虽然R语言的前身S语言也是四十多年前源自通信、计算机操作系统与程序语言的重要研发机构之一——贝尔实验室。无论学习何种程序语言,精通该语言数据对象的使用是成为熟练程序员的关键第一步。