在介绍DataFrame的数据结构时,我们解释过label 和position 两个概念,这两个概念和loc() 与iloc() 两个操作息息相关。所以,在介绍这两个操作之前,我们再简单复习一下label 和position :
label : 对DataFrame的列或行(Index)的名称统称为labelposition : 对DataFrame的列或行(Index)的排序位置(0,1,2,…)统称为position
相应地:
loc() : 基于label (或者是boolean数组)进行数据选择iloc() : 基于position (整数-integer)进行数据选择
iloc() 中的i 指的是integer,意为integer position的意思。
DataFrame.loc()
DataFrame.loc()支持如下类型的参数:
- 单一标签,例如:5或’a’(这里的5不是指position,而是一个值为5的index label)
- 一组标签列表,例如:['a’, 'b’, 'c’]
- 一个标签切片,例如:'a’:'f’
- 一个与行/列长度一致的boolean类型的数组
- 一个能返回上述四种结果的函数(字面量)
注意:以上所有参数都是单一维度的,当loc()只有上述一个参数时,是在行的维度上进行筛选,同时,loc()支持添加一个逗号,再配置一个列维度上的筛选参数。
在演示各种操作之前,我们先构建一个DF出来:
import numpy as np
import pandas as pd
df = pd.DataFrame([[2, 3], [5, 6], [8, 9]],
index=['cobra', 'viper', 'sidewinder'],
columns=['max_speed', 'shield'])

在该DF基础上,我们看一下loc()的特种操作。
基于单一标签筛选(行维度)
df.loc['viper']

'viper’是一个标签名,放在第一维度上(没有逗号分割,所以是行维度),因而筛选出的就是(viper,5,6)这一行数据
基于单一标签筛选(行/列两个维度)
我们也可以在行、列两个维度上分别筛选:
df.loc['cobra', 'shield']

这一操作既限定了行是cobra, 列是shield,所以只能筛选出一个cell,就是3。
基于一个标签数组筛选
df.loc[['viper', 'sidewinder']]

这一操作同时筛选了’viper’, 'sidewinder’两行数据。
基于一个切片筛选
df.loc['cobra':'viper', 'max_speed']

这是一个行/列复合条件的筛选,其中在行维度上,使用了slice,从’cobra’行连续选取到’viper’行,在列维度上选取’max_speed’这一列,最终得到了上图的结果集。
基于一个boolean数组筛选
df.loc[[False, False, True]]

这个boolean类型的数组是作用到行维度上的,False意为跳过,不选取,True自然为选取。
如果我们想从列维度上筛选想要的数据列,可以这样写:
df.loc[:, [False,True]]
输出:
shield
cobra 3
viper 6
sidewinder 9
这一操作的逻辑是:在行维度上通过:操作符全选,然后在列维度上单独选取第二个列。
同样的,我们也可以使用boolean数组在行、列两个维度上同时筛选:
df.loc[[False, False, True], [False,True]]
输出:
shield
sidewinder 9
该操作只选取了第三行,第二列。
基于一个函数字面量筛选
df.loc[df['shield'] > 6]

df['shield'] > 6 是一个boolean类型的表达式,它返回True或False,因些符合要求,它的筛选逻辑是:选出那些’shield’列的值大于6的所有的行。
一个更标准的例子是lambda表达式:
df.loc[lambda df: df['shield'] == 9]

这个lambda表达式(匿名函数)和df['shield'] == 9 是等效的。它的筛选逻辑是:选出那些’shield’列的值等于9的所有的行。
本节参考文章: https://www./pandas/dataframe/dataframe-loc.php
DataFrame.iloc()
在理解了DataFrame.loc()之后,DataFrame.iloc()就会变得简单很多,其操作与DataFrame.loc()高度一致,只是它所基于的不是标签,而是Position,是从0开始到lengh-1的位置序号。同样的,DataFrame.iloc()支持如下类型的参数:
- 一个Position整数,例如:5
- 一个Position整数数组,例如:[4, 3, 0]
- 一个Position整数切片,例如:1:7
- 一个与行/列长度一致的boolean类型的数组
- 一个能返回上述四种结果的函数(字面量)
在演示各种操作之前,我们先构建一个DF出来:
import numpy as np
import pandas as pd
mydict = [{'p': 2, 'q': 3, 'r': 4, 's': 5},
{'p': 200, 'q': 300, 'r': 400, 's': 500},
{'p': 2000, 'q': 3000, 'r': 4000, 's': 5000 }]
df = pd.DataFrame(mydict)
输出:

在该DF基础上,我们看一下iloc()的特种操作。
基于一个Position筛选
df.iloc[0]
输出:
p 2
q 3
r 4
s 5
选取的是第0行数据。
基于一个Position数组筛选
df.iloc[[0, 1]]
输出:

选出的是第0行和第1行数据。
基于一个Position切片筛选
df.iloc[:3]
输出: 
选出前3行记录。
基于一个boolean数组筛选
df.iloc[[True, False, True]]
输出: 
选出第0行和第2行数据
基于一个函数筛选
df.iloc[lambda x: x.index % 2 == 0]
输出: 
选出索引值是偶数的行,所以是0,2两行入选
本节参考文章: https://www./pandas/dataframe/dataframe-iloc.php
|