
1.4.2 Python语言衍生数据对象取值
如前所述,Python最重要的衍生数据对象当属numpy模块中的n维数组ndarray结构对象,以及pandas模块中的二维DataFrame结构对象。取值工作首先要了解Python语言的索引编号规则,图1.8显示前向索引编号从0开始,后向索引编号的负号(-)表示倒数,此点与R语言取值的负索引删除之意不同 。

图1.8 Python语言前向与后向索引编号示意图
numpy模块的n维数组ndarray取值方式类似R语言,首先使用np.arange()函数产生20个整数值,将其排列成4行5列的二维矩阵data。

Python语言取值以冒号运算符:分隔起始索引、终止索引与索引增量,形如(start:stop:step),起始与终止编号的取值规则是前包后不包,最后一个索引增量值默认为1,所以通常省略。假设对象data前四列是属性变量,最末列是反应变量,我们以numpy ndarray的取值语法分割属性矩阵与反应变量,二维取值以逗号,分隔行列各自的冒号运算符语法,各维全取时仍须键入冒号,而非R语言的空白。

二维data仍然可视为一维的结构进行取值,读者请注意终止索引被省略的含义(取到最后一个),以及负索引与间距的应用。

接下来说明初学者相当困扰的pandas二维DataFrame各种取值方法,先使用pandas模块的Excel读文件函数read_excel()读入Facebook打卡数据:

类别type()确认数据对象fb的类别,dir()函数查询pandas数据集对象可用属性与方法。

运用前述Python句点语法,查看各字段数据类型,其中int是整数变量,float是浮点数变量,而类别与地区两字段的object表示字符串。

Python套件pandas也有head()方法,默认可以显示前五笔数据。在此我们粗浅地比较Python与R语法的差异:R语言的泛函式编程语法倾向将数据对象传入函数中,如head(fb);而Python语言大多用面向对象句点语法(虽然Python也融入了泛函式编程的范式,参见1.6节编程范式与面向对象概念),对象名后接属性或方法,例如此处的fb.head()。两者输入参数值的方式是相同的,例如head(fb, n=4)与fb.head(n=4)。读者如能掌握R与Python前述语法上的差异,从数据驱动程序设计的角度理解代码,可以加快掌握两大工具的学习过程。

pandas数据集取值第一种方法是以中括号加上属性名称取出整列(注:R语言数据集大多也是用中括号取值),请注意一对中括号与两对中括号的差异,此点与1.3.7节提及的R语言列表对象两对中括号[[]]与一对中括号[]的取值差异类似。

第二种方法以Python的句点语法,后接DataFrame的属性取出整列。

第三种方法通过DataFrame的loc()方法取值,可以对行列进行限制,不过必须使用列名进行索引(label-based indexing)。

第四种方法通过iloc()方法取值,类似loc()方法也可以对行列进行限制,不过必须使用位置索引(positional indexing),也就是用变量编号而非变量名称了。

过去pandas数据集有一种通过ix()方法取值的方式,允许交替使用列名与列索引。不过新版的pandas套件已经宣布未来不支持ix()的取值方法,这也是使用开放源码软件须留意诸多套件改版信息的原因了。

总结来说,pandas的数据集整列选取可以使用第一种、第二种方法,后两种方法(loc()与iloc())适合做多条件的弹性数据选取。提醒读者:Python是计算机科学家开发出来的语言,其数据对象相比数学与统计驱动的R语言相对简单但是功能强大,虽然R语言的前身S语言也是四十多年前源自通信、计算机操作系统与程序语言的重要研发机构之一——贝尔实验室。无论学习何种程序语言,精通该语言数据对象的使用是成为熟练程序员的关键第一步。