![Python大数据与机器学习实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/134/30638134/b_30638134.jpg)
3.2 数据存取
DataFrame支持多种数据存取方式,包括对单个数据单元的存取、对整行整列的存取、迭代访问整个数据表,它们的用法和效率各有不同。本节将介绍操作数据表的基本方法及常用技巧。
3.2.1 访问数据表元素
1.访问列
最简单的访问数据表元素的方法是指定列名和行索引值。在访问列时,可以指定单个列名访问一列,返回Series类型数据,其中第一列是行的索引值,第二列values值是该字段的具体值;也可以使用列名数据访问多列,返回DataFrame类型数据,是原DataFrame的子集。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_79_3.jpg?sign=1739258631-SJZhB0cC3pyfP5dCY4fqyyTX5o8Tv22C-0-5dd4e5dc78311d7a1d170022d3d876ce)
2.访问记录
使用指定索引切片的方式访问行,返回的结果也是DataFrame。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_80_2.jpg?sign=1739258631-uUCd5K7CYREgES285uKlyUE6A1DmjWxh-0-23bdf1a490a31493eb69e67349603d96)
3.条件筛选记录
在下例中,通过条件筛选行。从返回结果可见,条件判断返回了Series,其索引为数据表的索引值,其值为bool值。如果将该Series作为行索引,则筛选其值为True的所有行。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_80_3.jpg?sign=1739258631-5h7IAbR6fcO0VUiFAnDcR1k6hz5NZBEF-0-e322a71e82f47a4f2ed5c9367e153b07)
当使用一个以上条件筛选时,就用逻辑运算符组合各个条件,注意下例中括号的使用。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_80_4.jpg?sign=1739258631-mkaA0TIjV9Jq8njHmvbv38RNd5UUhnzq-0-fce422fb3d724fb6de5be4a587185abb)
4.访问具体元素
访问具体某行和某列的值分别使用loc方法和iloc方法,二者的区别在于loc方法在访问数据时使用行索引名和列名,iloc方法在访问数据时使用行下标和列下标。iloc方法的参数是下标、下标数组,以及切片方式指定的数据范围。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_81_1.jpg?sign=1739258631-CVnkLRwKilCrBYB6nelIOukB8MAAUL6T-0-ee78b275404a64748b0a0ca94c73ea8e)
当使用loc方法访问数据表时,支持指定元素索引名、列名、列表、切片的方式设定参数。当对应参数为空时,默认展示所有行或列。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_81_2.jpg?sign=1739258631-lAgQk1vNC4NHz3uTAGxcXJ7gQVftpJK9-0-c318f0be214af015d33286f4023319ea)
loc方法还支持按条件索引,如下例中筛选出字段a==11的所有记录。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_81_3.jpg?sign=1739258631-SrI3VBGQDkVqJxpim6OeZblGP5Ui9oJb-0-00dd26a0d104e9c533f14fbd327fdb12)
除了loc方法和iloc方法,还可以使用ix混合索引。它综合了loc和iloc两种方法,可同时使用索引值和索引名。另外,它还可以使用at方法和iat方法获取单个元素的值,其参数设置方法类似于loc方法和iloc方法。
5.迭代访问数据表
使用iterrows方法可遍历数据表的每一条记录,以及其中的每一个元素。其中,idx是记录的索引值,item是每一条记录的具体数据,Series为数据类型。需要注意的是,使用迭代方法访问和修改数据的速度比较慢。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_1.jpg?sign=1739258631-Socoi3jV5tttfrdkenthPbVJudQ89Jki-0-37fdce28bbece89f4f7edaba3cb116ef)
3.2.2 修改数据表元素
1.修改列名
使用给columns赋值的方法可修改列名,请注意在使用此方法修改时,需要指定所有列的名称,无论是否修改。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_2.jpg?sign=1739258631-fjTxSQTLEO1vDCvnlHRLhI6cwkX2ew6X-0-1649432aad536059161578fc845ef3f7)
上述方法只能修改列名,不能修改数据表内容。如果想重排其中某几个列,使用下例中的方法调换位置。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_3.jpg?sign=1739258631-zqfdtkrUMSnkq0BLlvVLiWp4vlVs5IUX-0-1576174f51144096c1cb325fd1dab2a3)
使用rename方法修改列名,可用字典方法只描述被修改的列,而不影响其他列。下例中将列名“c”改为“d”。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_4.jpg?sign=1739258631-UQx3CURQrmrHiGklKf6ouKWYqeXb375Z-0-9242c40a8c3535bbd183fd4710b66aa5)
2.修改行索引值
修改行索引值的方法与修改列名的方法类似,如果使用直接对行索引赋值的方法,则需要列出所有索引值,无论是否修改。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_5.jpg?sign=1739258631-2mJS8FX48QQoonHXzaD1HUgBcgjtvU3D-0-88225d84cbd8d1b470ffcaa6ea4e0b7c)
使用rename方法,利用字典参数也可以修改行索引值,注意设置axis=0。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_6.jpg?sign=1739258631-EntfRR98Y9CEClt7HFQXbP9yvVDSqKVv-0-bcafa87a355ce9dd5f03fa5b124b8c98)
3.修改数据表内容
使用直接对列赋值的方法或者用loc指定列名的方法都可以修改整列的值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_2.jpg?sign=1739258631-GdZ2w7Fwbf0TIh8vTNQXImknTZrpy3U2-0-b9d113df698aa26517d9750f76b05dd4)
使用loc指定索引值的方法也可以对整行赋值,本列中使用了字典方法给行中元素赋值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_3.jpg?sign=1739258631-OOIBqsqeev7gxgQnieCfLP6kDxzSzxpu-0-d8d10dc94b6c8b1f0b72a5ef4a001e54)
同时,在指定行索引和列名时,可以给指定数据表中的指定元素赋值,此方法也可用于给多行或多列的元素赋值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_4.jpg?sign=1739258631-M2ayCHrlmL92VQINSNyJnXC541mrgzeL-0-dee59dbba5108d512d84ae2d2fc2886b)
下面的示例是一种相对复杂,但比较常用的数据处理方法,即将某个字段(本例中为字段b)大于边界值(本例中为10)的所有值都设置为边界值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_5.jpg?sign=1739258631-jXvhgvHZBHw5WxdlfNLC5T128pq6Xvs1-0-61659e4cc479c0459d5af17f2effdd48)
修改数据表元素的值也可以使用iloc方法,其与loc方法类似,此处不再详细讲解。
4.批量修改
用DataFrame的apply函数可批量修改表中的数据,最简单的用法是使用lambda表达式逐条对已有数据计算,以构造新数据。本例中将a列数据通过算术表达式转换成原数据的平方,b列通过逻辑判断语句将大于10的元素置为True,小于等于10的元素置为False。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_84_1.jpg?sign=1739258631-kJMkAEh0hiWFkAiTxOXHLACvnVQ6Uh21-0-a4f0aeb1340333994fe808b4faa670e4)
除lambda表达式以外,apply函数还支持调用函数,以实现更复杂的计算,这比使用iterrows遍历数据表修改数据更高效。下例中继续使用上例中的数据,利用a,b列元素的值构造出新列c。在调用apply函数时指定了两个参数,axis=1是指逐行处理,args指定了传给函数的两个附加参数。程序中定义了函数f,它的第一个参数是数据表中的每行数据,后两个参数是args中指定的参数。函数f使用数据表的a列、b列,并分别与参数arg1,arg2相乘再将其结果附值给c列。可以说,apply函数是在DataFrame中构造新特征时使用频率最高的方法。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_84_2.jpg?sign=1739258631-VQR7gjuDqHFujiI1MnW5aysgXSsoJjyt-0-11b6ed7187e9d8414b7123fb52a2d734)