
3.2 数据存取
DataFrame支持多种数据存取方式,包括对单个数据单元的存取、对整行整列的存取、迭代访问整个数据表,它们的用法和效率各有不同。本节将介绍操作数据表的基本方法及常用技巧。
3.2.1 访问数据表元素
1.访问列
最简单的访问数据表元素的方法是指定列名和行索引值。在访问列时,可以指定单个列名访问一列,返回Series类型数据,其中第一列是行的索引值,第二列values值是该字段的具体值;也可以使用列名数据访问多列,返回DataFrame类型数据,是原DataFrame的子集。

2.访问记录
使用指定索引切片的方式访问行,返回的结果也是DataFrame。

3.条件筛选记录
在下例中,通过条件筛选行。从返回结果可见,条件判断返回了Series,其索引为数据表的索引值,其值为bool值。如果将该Series作为行索引,则筛选其值为True的所有行。

当使用一个以上条件筛选时,就用逻辑运算符组合各个条件,注意下例中括号的使用。

4.访问具体元素
访问具体某行和某列的值分别使用loc方法和iloc方法,二者的区别在于loc方法在访问数据时使用行索引名和列名,iloc方法在访问数据时使用行下标和列下标。iloc方法的参数是下标、下标数组,以及切片方式指定的数据范围。

当使用loc方法访问数据表时,支持指定元素索引名、列名、列表、切片的方式设定参数。当对应参数为空时,默认展示所有行或列。

loc方法还支持按条件索引,如下例中筛选出字段a==11的所有记录。

除了loc方法和iloc方法,还可以使用ix混合索引。它综合了loc和iloc两种方法,可同时使用索引值和索引名。另外,它还可以使用at方法和iat方法获取单个元素的值,其参数设置方法类似于loc方法和iloc方法。
5.迭代访问数据表
使用iterrows方法可遍历数据表的每一条记录,以及其中的每一个元素。其中,idx是记录的索引值,item是每一条记录的具体数据,Series为数据类型。需要注意的是,使用迭代方法访问和修改数据的速度比较慢。

3.2.2 修改数据表元素
1.修改列名
使用给columns赋值的方法可修改列名,请注意在使用此方法修改时,需要指定所有列的名称,无论是否修改。

上述方法只能修改列名,不能修改数据表内容。如果想重排其中某几个列,使用下例中的方法调换位置。

使用rename方法修改列名,可用字典方法只描述被修改的列,而不影响其他列。下例中将列名“c”改为“d”。

2.修改行索引值
修改行索引值的方法与修改列名的方法类似,如果使用直接对行索引赋值的方法,则需要列出所有索引值,无论是否修改。

使用rename方法,利用字典参数也可以修改行索引值,注意设置axis=0。

3.修改数据表内容
使用直接对列赋值的方法或者用loc指定列名的方法都可以修改整列的值。

使用loc指定索引值的方法也可以对整行赋值,本列中使用了字典方法给行中元素赋值。

同时,在指定行索引和列名时,可以给指定数据表中的指定元素赋值,此方法也可用于给多行或多列的元素赋值。

下面的示例是一种相对复杂,但比较常用的数据处理方法,即将某个字段(本例中为字段b)大于边界值(本例中为10)的所有值都设置为边界值。

修改数据表元素的值也可以使用iloc方法,其与loc方法类似,此处不再详细讲解。
4.批量修改
用DataFrame的apply函数可批量修改表中的数据,最简单的用法是使用lambda表达式逐条对已有数据计算,以构造新数据。本例中将a列数据通过算术表达式转换成原数据的平方,b列通过逻辑判断语句将大于10的元素置为True,小于等于10的元素置为False。

除lambda表达式以外,apply函数还支持调用函数,以实现更复杂的计算,这比使用iterrows遍历数据表修改数据更高效。下例中继续使用上例中的数据,利用a,b列元素的值构造出新列c。在调用apply函数时指定了两个参数,axis=1是指逐行处理,args指定了传给函数的两个附加参数。程序中定义了函数f,它的第一个参数是数据表中的每行数据,后两个参数是args中指定的参数。函数f使用数据表的a列、b列,并分别与参数arg1,arg2相乘再将其结果附值给c列。可以说,apply函数是在DataFrame中构造新特征时使用频率最高的方法。
