python的高级技巧:Pandas中的`iloc[]`和`loc[]`

python的高级技巧:Pandas中的iloc[]loc[]
iloc[]loc[]是Pandas中用于数据索引/切片的核心方法,核心区别在于索引依据不同iloc基于"整数位置",loc基于"标签(行索引名/列名)"。以下分点对比并结合实例说明:

一、区别对比

维度 iloc[](integer location) loc[](label location)
索引依据 行/列的整数位置(从0开始计数) 行的索引名 、列的列名(标签)
切片规则 左闭右开(如0:2仅包含位置0、1) 包含终点(如'a':'c'包含标签a、b、c)
支持的索引类型 整数、整数列表、整数切片、布尔数组 标签、标签列表、标签切片、布尔数组
适用场景 按数据的"物理顺序"取数(不管行/列标签) 按数据的"逻辑标签"取数(依赖行/列的命名)

注:Pandas 的 "列标签" 和 "行标签" 分别对应 DataFrame.columnsDataFrame.index。而机器学习中的 "样本标签"是指样本的目标值(label / 目标变量),二者不同。

二、实例演示(构造带自定义标签的DataFrame)

先创建一个行索引为自定义标签的DataFrame(避免默认整数索引,更易体现区别):

python 复制代码
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(按整数位置) :行位置0对应"张三",列位置0对应"数学"

    python 复制代码
    data.iloc[0]  # 取第1行(位置0)
    # 输出:
    # 数学    90
    # 英语    88
    # Name: 张三, dtype: int64
  • loc(按标签) :直接用行标签"张三"、列名"数学"

    python 复制代码
    data.loc['张三']  # 取标签为"张三"的行
    # 输出同iloc[0]
2. 取多行/多列(切片)
  • iloc(左闭右开)0:2仅包含位置0、1(对应"张三""李四")

    python 复制代码
    data.iloc[0:2]  # 取位置0到2(不含2)的行
    # 输出:
    #    数学  英语
    # 张三  90  88
    # 李四  85  92
  • loc(包含终点)'张三':'王五'包含所有标签在"张三"到"王五"之间的行

    python 复制代码
    data.loc['张三':'王五']  # 取标签从"张三"到"王五"的行(含王五)
    # 输出:
    #    数学  英语
    # 张三  90  88
    # 李四  85  92
    # 王五  78  75
3. 取特定行+列(二维索引)
  • iloc(行位置+列位置) :行位置1(李四)、列位置1(英语)

    python 复制代码
    data.iloc[1, 1]  # 取第2行(位置1)、第2列(位置1)的值
    # 输出:92
  • loc(行标签+列名) :行标签"李四"、列名"英语"

    python 复制代码
    data.loc['李四', '英语']  # 取"李四"行、"英语"列的值
    # 输出:92
4. 布尔索引(按条件取数)

两者都支持布尔数组,但loc更常用(直接关联标签):

python 复制代码
# 条件:数学分数>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
相关推荐
52Hz11818 分钟前
力扣230.二叉搜索树中第k小的元素、199.二叉树的右视图、114.二叉树展开为链表
python·算法·leetcode
喵手19 分钟前
Python爬虫实战:网页截图归档完全指南 - 构建生产级页面存证与历史回溯系统!
爬虫·python·爬虫实战·零基础python爬虫教学·网页截图归档·历史回溯·生产级方案
张3蜂37 分钟前
Python 四大 Web 框架对比解析:FastAPI、Django、Flask 与 Tornado
前端·python·fastapi
qq_124987075338 分钟前
基于Java Web的城市花园小区维修管理系统的设计与实现(源码+论文+部署+安装)
java·开发语言·前端·spring boot·spring·毕业设计·计算机毕业设计
2601_948374571 小时前
商用电子秤怎么选
大数据·python
Volunteer Technology1 小时前
Sentinel的限流算法
java·python·算法
froginwe111 小时前
Python 条件语句
开发语言
七夜zippoe1 小时前
Python统计分析实战:从描述统计到假设检验的完整指南
开发语言·python·统计分析·置信区间·概率分布
2601_949146531 小时前
Python语音通知API示例代码汇总:基于Requests库的语音接口调用实战
开发语言·python
去码头整点薯条981 小时前
python第五次作业
linux·前端·python