Pandas中iloc[]和loc[]的使用详解与区别对比
本文深入解析Pandas中iloc与loc两种核心索引方法的本质区别。iloc基于整数位置进行切片,遵循左闭右开规则;loc基于标签进行索引,包含终点。通过自定义索引DataFrame实例,详细演示单行、多行、布尔索引及二维取值的具体用法,并重点剖析默认整数索引下的逻辑陷阱与切片边界差异,帮助开发者准确选择索引方式。
在Pandas库中,iloc[]和loc[]是执行数据索引与切片操作的两个核心工具。它们最根本的区别在于索引依据的不同:iloc[]严格基于“整数位置”(从0开始的物理顺序)进行访问,而loc[]则基于“标签”(即行索引名称或列名)进行访问。以下将通过对比分析与具体代码实例,详细阐述两者的用法与差异。
一、核心区别对比
| 维度 | iloc[](integer location) | loc[](label location) |
|---|---|---|
| 索引依据 | 行/列的整数位置(从0开始计数) | 行的索引名、列的列名(标签) |
| 切片规则 | 左闭右开(如0:2仅包含位置0、1) | 包含终点(如'a':'c'包含标签a、b、c) |
| 支持的索引类型 | 整数、整数列表、整数切片、布尔数组 | 标签、标签列表、标签切片、布尔数组 |
| 适用场景 | 按数据的“物理顺序”取数(不管行/列标签) | 按数据的“逻辑标签”取数(依赖行/列的命名) |
需要明确的是,Pandas中的“列标签”和“行标签”分别对应DataFrame对象的columns属性和index属性。这与机器学习领域中代表目标变量的“样本标签”(label/target variable)概念完全不同,请勿混淆。此外,iloc和loc均支持传入可调用对象(callable),例如可以使用df.loc[lambda df: df['列名']>0]这样的语法进行动态索引。
二、实例演示(构建带有自定义标签的DataFrame)
为了更直观地展示两者的区别,我们首先创建一个行索引为自定义字符串标签的DataFrame。这样做可以避免使用默认的整数索引,从而清晰体现iloc与loc在语义上的不同。
import pandas as pd
data = pd.DataFrame(
data={'数学': [90, 85, 78], '英语': [88, 92, 75]},
index=['张三', '李四', '王五'] # 行标签(非默认整数)
)
print("原始DataFrame:")
print(data)
输出结果如下:
数学 英语 张三 90 88 李四 85 92 王五 78 75
1. iloc获取单行与loc获取单列
- iloc(按整数位置):行位置0对应“张三”,列位置0对应“数学”
data.iloc[0] # 取第1行(位置0) # 输出: # 数学 90 # 英语 88 # Name: 张三, dtype: int64
loc(按标签):直接使用行标签“张三”、列名“数学”data.loc['张三'] # 取标签为“张三”的行 # 输出同iloc[0]
2. iloc获取多行与loc获取多列(切片操作)
iloc(左闭右开):0:2仅包含位置0、1(对应“张三”“李四”)data.iloc[0:2] # 取位置0到2(不含2)的行 # 输出: # 数学 英语 # 张三 90 88 # 李四 85 92
loc(包含终点):'张三':'王五'包含所有标签在“张三”到“王五”之间的行data.loc['张三':'王五'] # 取标签从“张三”到“王五”的行(含王五) # 输出: # 数学 英语 # 张三 90 88 # 李四 85 92 # 王五 78 75
3. 获取特定行与列的组合(二维索引)
iloc(行位置+列位置):行位置1(李四)、列位置1(英语)data.iloc[1, 1] # 取第2行(位置1)、第2列(位置1)的值 # 输出:92
loc(行标签+列名):行标签“李四”、列名“英语”data.loc['李四', '英语'] # 取“李四”行、“英语”列的值 # 输出:92
4. 布尔索引(基于条件筛选数据)
虽然iloc和loc都支持布尔数组作为索引条件,但在实际应用中loc更为常用,因为它能直接关联到数据的标签,语义更加直观。
# 条件:数学分数>80 mask = data['数学'] > 80 # iloc:先获取满足条件的行位置,再取数 data.iloc[mask.values] # mask.values是布尔数组,对应行位置 # 输出: # 数学 英语 # 张三 90 88 # 李四 85 92 # loc:直接用布尔数组取数(更直观) data.loc[mask] # 输出同iloc
三、关键注意事项
- 当DataFrame使用默认的整数行索引(如0、1、2...)时,
iloc[0]和loc[0]返回的结果可能看起来完全相同,但它们的底层逻辑截然不同:iloc[0]的含义是“获取物理位置为0的那一行”,而loc[0]的含义是“获取标签值为0的那一行”。 - 在切片规则上,
iloc遵循左闭右开原则(例如0:3仅包含位置0、1、2),而loc的切片则包含终点(例如0:3包含标签0、1、2、3的所有数据)。这是开发者最容易踩坑的地方。 - 实际场景中:
- 如果你需要根据“数据的物理顺序”进行提取(例如“获取前5行数据”),应当使用
iloc。 - 如果你需要根据“行或列的命名”进行提取(例如“获取名为‘张三’的学生成绩”),应当使用
loc。
- 如果你需要根据“数据的物理顺序”进行提取(例如“获取前5行数据”),应当使用
测试:请尝试理解以下复杂程序的执行逻辑:
numerical_df.loc[numerical_df['A'] < numerical_df['B'], 'A'] = 100
以上就是关于Pandas中iloc[]和loc[]实现示例的详细介绍。如需了解更多相关Pandas iloc[]和loc[]的内容,欢迎搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









