![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=1739250089-KI6OM0XgRjIBY8uHoyVsH7eRnWF3X5fX-0-2ef4946e0eaba129b2f2c062d438118d)
2.访问记录
使用指定索引切片的方式访问行,返回的结果也是DataFrame。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_80_2.jpg?sign=1739250089-h0ZG7EgT7sUoB18Miamh0UNR0S1VgyBS-0-5f88ff8040a40d400daeba9fe5c6d376)
3.条件筛选记录
在下例中,通过条件筛选行。从返回结果可见,条件判断返回了Series,其索引为数据表的索引值,其值为bool值。如果将该Series作为行索引,则筛选其值为True的所有行。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_80_3.jpg?sign=1739250089-rJ2DxwlnxgpitfR3uZSjMztMOaTYbUK8-0-2e07bea3adaac1921cd2f67691ad699a)
当使用一个以上条件筛选时,就用逻辑运算符组合各个条件,注意下例中括号的使用。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_80_4.jpg?sign=1739250089-wllR2GWePchICm7bapUROWDukai1TTeM-0-c34a0f85e95a49771e1671e43adb76e6)
4.访问具体元素
访问具体某行和某列的值分别使用loc方法和iloc方法,二者的区别在于loc方法在访问数据时使用行索引名和列名,iloc方法在访问数据时使用行下标和列下标。iloc方法的参数是下标、下标数组,以及切片方式指定的数据范围。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_81_1.jpg?sign=1739250089-raI63pcekHsRrHDa9aKH6mNot0XJIYgb-0-cbd6187cc65ade5f5657af755e068fee)
当使用loc方法访问数据表时,支持指定元素索引名、列名、列表、切片的方式设定参数。当对应参数为空时,默认展示所有行或列。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_81_2.jpg?sign=1739250089-mkzysxwust3HjoifuMh0Gdk0ktPB9ZpT-0-01a29e2965d1687f110a2e7a23042a8a)
loc方法还支持按条件索引,如下例中筛选出字段a==11的所有记录。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_81_3.jpg?sign=1739250089-WXstkTWTK96TMcO92Yf1DHVtrE6WrYWy-0-885930df399500cc49800cd8cb88c468)
除了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=1739250089-5mMGgLdE3c5IHo5X8zUFI1pF8H8TvpDD-0-bd73827cea3acfff45d5c60a4b10cb51)
3.2.2 修改数据表元素
1.修改列名
使用给columns赋值的方法可修改列名,请注意在使用此方法修改时,需要指定所有列的名称,无论是否修改。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_2.jpg?sign=1739250089-PPbYkNVNwFIztTKPR4rtcbeggSUtmzxT-0-86516a5fcd9bfa87df420fcf69f8d794)
上述方法只能修改列名,不能修改数据表内容。如果想重排其中某几个列,使用下例中的方法调换位置。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_3.jpg?sign=1739250089-uaFWI3GeStaVuaamB0xE3JZSyojdL4Nx-0-a10fa73f73b486861ae712b5982a0fef)
使用rename方法修改列名,可用字典方法只描述被修改的列,而不影响其他列。下例中将列名“c”改为“d”。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_4.jpg?sign=1739250089-82Ooh6ZBO8Tn2WRUOB32jH7srTbQuUk4-0-9c3530431f42baf5574b20462bb529b4)
2.修改行索引值
修改行索引值的方法与修改列名的方法类似,如果使用直接对行索引赋值的方法,则需要列出所有索引值,无论是否修改。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_5.jpg?sign=1739250089-Git13I1uFjkx7W4ggf8eq0Rf01p2nfTW-0-943bf0c6729c65f3c045369153d26f64)
使用rename方法,利用字典参数也可以修改行索引值,注意设置axis=0。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_82_6.jpg?sign=1739250089-YD9cW9ECeJzFhWBF2TmDGFSthorJe6by-0-5c2a07ff191e21e689fd667d5f164cf6)
3.修改数据表内容
使用直接对列赋值的方法或者用loc指定列名的方法都可以修改整列的值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_2.jpg?sign=1739250089-uTGKmC5A1vEnKsVuJHU56oWtCOP3gEYn-0-fc5f5111c954b8191cc93defa8fa011b)
使用loc指定索引值的方法也可以对整行赋值,本列中使用了字典方法给行中元素赋值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_3.jpg?sign=1739250089-1DZ2infBzPLHQ6IuIQMzRtwebaAxkUvc-0-236806b66a319cf62cc1240aea976998)
同时,在指定行索引和列名时,可以给指定数据表中的指定元素赋值,此方法也可用于给多行或多列的元素赋值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_4.jpg?sign=1739250089-8ja04aBtIBl4GPetm807Zx6nOHiko1QB-0-c3d82a0e037d5cecc83e5fc3022d7ae8)
下面的示例是一种相对复杂,但比较常用的数据处理方法,即将某个字段(本例中为字段b)大于边界值(本例中为10)的所有值都设置为边界值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_83_5.jpg?sign=1739250089-ScKfRAt8Ck0F2B8t9gzJJZf0k3OlbB3m-0-e60901e519fc089a59d8b25b39ad60ba)
修改数据表元素的值也可以使用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=1739250089-Q7SnZdtHXrJsudmj7oNaKQhrqtWtoG2u-0-daf739a4efcde2f25d7a56995a1d7714)
除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=1739250089-cqHlEekbYkk6xtaCyng84Cm5dhXdqpPI-0-f21f7f0af7bc9e60222ff26cd0b0df81)