Python中loc和iloc的用法详解

loc 是 Pandas 中用于 基于标签(label-based)的索引选择方法,专门用于按行/列标签精准定位和操作 DataFrame 或 Series 中的数据。以下是详细解析:


一、核心功能

1. 基本语法
df.loc[行标签选择, 列标签选择]
  • 行标签选择:可以是单个标签、标签列表、切片(如 "a":"d")或布尔条件
  • 列标签选择:同上,支持标签筛选
  • 2. 特性
  • 标签优先:索引基于行/列的名称(字符串或数字标签),而非位置
  • 闭区间:切片包含起始和结束标签(与 Python 常规切片不同)
  • 支持高级操作:布尔索引、条件过滤、函数调用等

  • 二、典型使用场景

    1. 精确提取单值
    # 获取行标签为2,列标签为'Age'的值
    df.loc[2, 'Age'] 
    
    2. 选择行范围 + 多列
    # 选取行标签从'user1'到'user3',列标签'Name'和'Score'
    df.loc['user1':'user3', ['Name', 'Score']]
    
    3. 条件筛选
    # 选择所有年龄大于30的行,并显示'City'列
    df.loc[df['Age'] > 30, 'City']
    
    4. 修改数据
    # 将行标签为5的'Status'列值改为'active'
    df.loc[5, 'Status'] = 'active'
    

    三、与 iloc 的对比

    特性 loc iloc
    索引类型 标签(字符串或数字) 纯整数位置(0-based)
    切片区间 闭区间(包含两端) 左闭右开(Python 标准切片)
    允许输入类型 标签、布尔数组、条件表达式 整数、整数列表、整数切片
    示例 df.loc['a':'c', 'Name'] df.iloc[0:3, 1]

    四、避坑指南

    1. 避免链式赋值
    # ❌ 可能引发 SettingWithCopyWarning
    df['Age'][df['Name'] == 'Alice'] = 25  
    
    # ✅ 规范写法
    df.loc[df['Name'] == 'Alice', 'Age'] = 25
    
    2. 处理混合索引

    当 DataFrame 的索引是整数时,lociloc 可能产生歧义:

    df = pd.DataFrame({'A': [1,2,3]}, index=[10, 20, 30])
    
    # 按标签选择(查找标签为1的行)
    df.loc[10]   # ✅ 返回第10标签行
    
    # 按位置选择(查找第0行)
    df.iloc[0]   # ✅ 返回第10标签行(位置0)
    

    五、高级用法示例

    1. 使用函数筛选
    # 选择索引以'2023'开头的行
    df.loc[lambda x: x.index.str.startswith('2023')]
    
    2. 多条件复合筛选
    # 选择年龄在20-30岁且城市为北京的行
    df.loc[(df['Age'] >= 20) & (df['City'] == '北京')]
    
    3. 跨列计算赋值
    # 当Score列大于90时,Status设为'A+'
    df.loc[df['Score'] > 90, 'Status'] = 'A+'
    

    六、总结

  • 核心作用:基于标签精准操作数据(查、改、删)
  • 优势:代码可读性高,支持复杂条件筛选
  • 适用场景:数据清洗、条件筛选、动态计算等
  • # 典型工作流示例
    cleaned_data = df.loc[df['Quality'] > 0.8, ['ID', 'Value']]  # 筛选高质量数据
    cleaned_data.loc[:, 'Value'] *= 100  # 批量修改选中列的值
    

    作者:我不是少爷.

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python中loc和iloc的用法详解

    发表回复