![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=1739272174-yNj0bl3tDQHvzftD4DoQg4AaIyluFzZM-0-b4ab74f0a9e05079b0fd8e56b164401d)
2.访问记录
使用指定索引切片的方式访问行,返回的结果也是DataFrame。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_80_2.jpg?sign=1739272174-Coqaf1xJHM1jbmRELFsuvXn7J0LXSnpm-0-a0362fbb04fe62bb3eac67e9ccb6c12a)
3.条件筛选记录
在下例中,通过条件筛选行。从返回结果可见,条件判断返回了Series,其索引为数据表的索引值,其值为bool值。如果将该Series作为行索引,则筛选其值为True的所有行。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_80_3.jpg?sign=1739272174-u9u0CZyFvD24DkZoJhVQa4qjbvHYwTDc-0-a2f76007cf3bb310dc92f37893701ad6)
当使用一个以上条件筛选时,就用逻辑运算符组合各个条件,注意下例中括号的使用。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_80_4.jpg?sign=1739272174-NhatmhffHFdJE8YhEkr2kZXnqhChiCGb-0-e3dc3996b067711d73d30293fb5678a1)
4.访问具体元素
访问具体某行和某列的值分别使用loc方法和iloc方法,二者的区别在于loc方法在访问数据时使用行索引名和列名,iloc方法在访问数据时使用行下标和列下标。iloc方法的参数是下标、下标数组,以及切片方式指定的数据范围。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_81_1.jpg?sign=1739272174-dXYzHqJyy3KmZ31P56jdD3PpbdcQAlIU-0-5d98229d5501a10ecc99aa5bb75fe7b9)
当使用loc方法访问数据表时,支持指定元素索引名、列名、列表、切片的方式设定参数。当对应参数为空时,默认展示所有行或列。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_81_2.jpg?sign=1739272174-cH4Z4nIjiX7fhFmq3IPbnCInZfbx2I1J-0-7d9ffeb2a4c2bfadd2652ce23b6cd4d8)
loc方法还支持按条件索引,如下例中筛选出字段a==11的所有记录。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_81_3.jpg?sign=1739272174-LJjlE9Ot0ZYgLKSthe460x9Z1nnbyUrc-0-fb39b4c27bd60aa3598c8c4ba5d71145)
除了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=1739272174-1nQdcFA3s8ecGAii8RofpaYUgTx4zqu8-0-0cc31ab4a75e44d68a290ee045dfdaa2)
3.2.2 修改数据表元素
1.修改列名
使用给columns赋值的方法可修改列名,请注意在使用此方法修改时,需要指定所有列的名称,无论是否修改。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_2.jpg?sign=1739272174-LI0JyyenYDqX0a82xwm0pHzW8QlhPOaU-0-61c455979b8dd4b011dc52e87260ae15)
上述方法只能修改列名,不能修改数据表内容。如果想重排其中某几个列,使用下例中的方法调换位置。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_3.jpg?sign=1739272174-uui6s9oKNaVvJAYerObk6m65dsu6iUxt-0-5e1b7de3eab910569a8e711bb7bfbdab)
使用rename方法修改列名,可用字典方法只描述被修改的列,而不影响其他列。下例中将列名“c”改为“d”。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_4.jpg?sign=1739272174-l2pdR3SZWNGVvkDNWNKmOIp3yGDCKkXI-0-ff69bc7db0f4988b07fbf5632f57929e)
2.修改行索引值
修改行索引值的方法与修改列名的方法类似,如果使用直接对行索引赋值的方法,则需要列出所有索引值,无论是否修改。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_5.jpg?sign=1739272174-JZt2wWmhSz1Arl5AnNGayTpuyfdlLmgH-0-2f2b11fbabc47330526316349fcb7dfa)
使用rename方法,利用字典参数也可以修改行索引值,注意设置axis=0。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_6.jpg?sign=1739272174-pe2aogrFPFNhZloVIkRfj4v5zR32PiFL-0-4350a60bc1c984baa2c76c5860cc8c53)
3.修改数据表内容
使用直接对列赋值的方法或者用loc指定列名的方法都可以修改整列的值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_2.jpg?sign=1739272174-9bdoihU1N9Ew4REO4GqvnXcTZBp4OMZR-0-3ea76deffd9d97c10446a2ec6ecc3f7e)
使用loc指定索引值的方法也可以对整行赋值,本列中使用了字典方法给行中元素赋值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_3.jpg?sign=1739272174-mxaiioOxxdl42c1AchL7zIbYdHWXM0So-0-7fdfd2bfe2e4a710f8adf6f75751f8a4)
同时,在指定行索引和列名时,可以给指定数据表中的指定元素赋值,此方法也可用于给多行或多列的元素赋值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_4.jpg?sign=1739272174-JH5ZJAOLeVKz3rXD2XjJ01GlpKaK6Ir4-0-ee3b4ae063d39567c0efc0167935fe1f)
下面的示例是一种相对复杂,但比较常用的数据处理方法,即将某个字段(本例中为字段b)大于边界值(本例中为10)的所有值都设置为边界值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_5.jpg?sign=1739272174-46QDRFyXydsTRaPMojrElwQzmcWtdWLm-0-587c7c95e97b750761f8f1cb2d46c7f7)
修改数据表元素的值也可以使用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=1739272174-Ia4TB1Zy2Yb7rW9R8StFlKF0sizQobhS-0-63f9228554ac3762676262fd36aaa383)
除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=1739272174-Ja1gpAiTRL6iDfCzwsAHv3duRGT6Ic2n-0-7f39b21886403e24894dbf8cc6aa5798)