Pandas中iloc[]和loc[]的使用详解与区别对比

沈亦白
沈亦白
发布时间:2026-10-12 | 3人浏览过
原创

本文深入解析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

三、关键注意事项

  1. 当DataFrame使用默认的整数行索引(如0、1、2...)时,iloc[0]和loc[0]返回的结果可能看起来完全相同,但它们的底层逻辑截然不同:iloc[0]的含义是“获取物理位置为0的那一行”,而loc[0]的含义是“获取标签值为0的那一行”。
  2. 在切片规则上,iloc遵循左闭右开原则(例如0:3仅包含位置0、1、2),而loc的切片则包含终点(例如0:3包含标签0、1、2、3的所有数据)。这是开发者最容易踩坑的地方。
  3. 实际场景中:
    • 如果你需要根据“数据的物理顺序”进行提取(例如“获取前5行数据”),应当使用iloc。
    • 如果你需要根据“行或列的命名”进行提取(例如“获取名为‘张三’的学生成绩”),应当使用loc。

测试:请尝试理解以下复杂程序的执行逻辑:

numerical_df.loc[numerical_df['A'] < numerical_df['B'], 'A'] = 100

以上就是关于Pandas中iloc[]和loc[]实现示例的详细介绍。如需了解更多相关Pandas iloc[]和loc[]的内容,欢迎搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表