pin_drop当前位置:知识文库 ❯ 图文

pandas DataFrame选择数据 - loc与iloc详解

一、loc与iloc概述

在 pandas 中,lociloc 是 DataFrame 最常用的数据选择器。它们提供了强大的行列索引功能,可以根据标签或位置精确提取、修改数据。

  • loc:基于标签(label)进行选择,使用行索引和列名

  • iloc:基于整数位置(integer location)进行选择,使用行列的整数索引

理解两者的区别是掌握 pandas 数据选择的关键。混淆 loc 和 iloc 是初学者最常见的错误之一。


二、loc - 基于标签的选择

df.loc[行标签, 列标签] 使用索引标签和列名来选择数据。

基本语法

代码示例

# 选择单行
df.loc['行标签']

# 选择单行单列(单个值)
df.loc['行标签', '列名']

# 选择多行
df.loc[['行标签1', '行标签2']]

# 选择多行多列
df.loc[['行标签1', '行标签2'], ['列名1', '列名2']]

# 切片(包含两端)
df.loc['起始行':'结束行', '起始列':'结束列']

# 条件选择
df.loc[df['列名'] > 值]

重要特性:loc 的切片操作包含两端(闭区间),这与 Python 原生的切片不同。


三、iloc - 基于位置的选择

df.iloc[行位置, 列位置] 使用整数位置(从0开始)来选择数据。

基本语法

代码示例

# 选择单行(第0行)
df.iloc[0]

# 选择单个值(第0行第1列)
df.iloc[0, 1]

# 选择多行(第0和第2行)
df.iloc[[0, 2]]

# 切片(不包含末尾,同Python原生)
df.iloc[0:3]      # 第0,1,2行
df.iloc[0:3, 1:3] # 第0-2行,第1-2列

# 使用负数索引
df.iloc[-1]       # 最后一行
df.iloc[:, -1]    # 最后一列

重要特性:iloc 的切片操作不包含末尾(左闭右开区间),与 Python 原生切片一致。


四、参数说明

选择器 第一个参数 第二个参数
loc 行索引标签(字符串/整数/布尔数组) 列名(字符串/列表/切片)
iloc 行整数位置(0, 1, 2, ...) 列整数位置(0, 1, 2, ...)

五、代码示例

示例1:创建示例数据

代码示例

import pandas as pd

# 创建示例DataFrame
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '年龄': [25, 30, 28, 35, 22],
    '城市': ['北京', '上海', '广州', '深圳', '杭州'],
    '薪资': [15000, 20000, 18000, 25000, 12000],
    '部门': ['技术', '市场', '技术', '人事', '财务']
}, index=['emp001', 'emp002', 'emp003', 'emp004', 'emp005'])

print(df)
#          姓名  年龄  城市     薪资  部门
# emp001  张三  25  北京  15000  技术
# emp002  李四  30  上海  20000  市场
# emp003  王五  28  广州  18000  技术
# emp004  赵六  35  深圳  25000  人事
# emp005  钱七  22  杭州  12000  财务

示例2:loc 选择数据

代码示例

# 选择单行
print("=== 选择emp001 ===")
print(df.loc['emp001'])

# 选择单行单列
print("\n=== emp002的姓名 ===")
print(df.loc['emp002', '姓名'])  # 输出: 李四

# 选择多行
print("\n=== 选择emp001和emp003 ===")
print(df.loc[['emp001', 'emp003']])

# 选择多行多列
print("\n=== 选择emp001-emp003的姓名和薪资 ===")
print(df.loc['emp001':'emp003', ['姓名', '薪资']])

# 切片(包含两端!)
print("\n=== emp002到emp004的所有列 ===")
print(df.loc['emp002':'emp004'])  # 包含emp004

# 选择某列
print("\n=== 所有人的姓名 ===")
print(df.loc[:, '姓名'])

输出:

代码示例

=== 选择emp001 ===
姓名     张三
年龄     25
城市     北京
薪资    15000
部门     技术
Name: emp001, dtype: object

=== emp002的姓名 ===
李四

=== 选择emp001和emp003 ===
          姓名  年龄  城市     薪资  部门
emp001  张三  25  北京  15000  技术
emp003  王五  28  广州  18000  技术

=== 选择emp001-emp003的姓名和薪资 ===
          姓名     薪资
emp001  张三  15000
emp002  李四  20000
emp003  王五  18000

=== emp002到emp004的所有列 ===
          姓名  年龄  城市     薪资  部门
emp002  李四  30  上海  20000  市场
emp003  王五  28  广州  18000  技术
emp004  赵六  35  深圳  25000  人事

=== 所有人的姓名 ===
emp001    张三
emp002    李四
emp003    王五
emp004    赵六
emp005    钱七
Name: 姓名, dtype: object

示例3:iloc 选择数据

代码示例

# 选择第0行
print("=== 第1行 ===")
print(df.iloc[0])

# 选择单个值(第0行第1列)
print("\n=== 第1行第2列的值 ===")
print(df.iloc[0, 1])  # 输出: 25

# 切片(不包含末尾)
print("\n=== 前3行 ===")
print(df.iloc[0:3])  # 第0,1,2行,不包含3

# 选择多行多列
print("\n=== 第0,2,4行的第1,3列 ===")
print(df.iloc[[0, 2, 4], [1, 3]])

# 负数索引
print("\n=== 最后一行 ===")
print(df.iloc[-1])

print("\n=== 最后一列 ===")
print(df.iloc[:, -1])

# 范围切片
print("\n=== 前3行的前3列 ===")
print(df.iloc[0:3, 0:3])

示例4:使用loc修改数据

代码示例

# 修改单个值
df.loc['emp001', '薪资'] = 16000

# 修改整行
df.loc['emp005'] = ['孙八', 26, '南京', 14000, '技术']

# 修改整列
df.loc[:, '薪资'] = df.loc[:, '薪资'] * 1.1  # 涨薪10%

# 条件修改
df.loc[df['部门'] == '技术', '薪资'] = df.loc[df['部门'] == '技术', '薪资'] + 2000

print(df)

六、实际应用场景

  • 数据查询:根据特定条件快速查找并提取数据行

  • 数据修改:更新特定行、列或单元格的值

  • 特征提取:从数据集中提取特定列作为机器学习特征

  • 数据采样:使用iloc随机抽取数据样本


七、注意事项

注意1:loc 的切片包含右端点,iloc 的切片不包含右端点。这是最容易混淆的地方!

注意2:如果索引是整数类型(如0,1,2),loc 按值匹配,iloc 按位置匹配。当索引为 0,1,2 时,loc[0] 和 iloc[0] 结果相同但含义不同。

注意3:使用 df['列名'] 只能选择列,而 loc/iloc 可以同时选择行和列。

小贴士

当索引为整数时,df[0:3] 的行为可能产生歧义(按位置还是按标签?)。建议始终使用 loc 或 iloc 明确指定选择方式,提高代码可读性。


八、loc与iloc对比

特性 loc iloc
选择依据 索引标签(label) 整数位置(position)
切片范围 闭区间(包含两端) 左闭右开(不含右端)
行选择 行索引标签 行整数位置
列选择 列名 列整数位置
条件筛选 支持布尔数组 不支持
负数索引 不支持 支持
使用场景 已知索引名时使用 按位置选择时使用

九、小结

  • loc 基于标签选择,iloc 基于整数位置选择

  • loc 切片包含右端点,iloc 切片不包含右端点

  • loc 支持条件筛选和布尔数组,iloc 不支持

  • iloc 支持负数索引,loc 不支持

  • 两者都可用于数据读取和修改操作


十、练习题

练习1

创建一个5行4列的DataFrame,行索引为日期(使用 pd.date_range()),列名为 A、B、C、D。使用 loc 选择前3行的 A、C 列,使用 iloc 选择同样的数据,对比结果。

练习2

创建一个包含学生成绩的 DataFrame(学号、姓名、语文、数学、英语),使用 loc 将数学成绩大于等于90分的学生语文成绩增加5分。

练习3

使用 iloc 的负数索引功能,选择 DataFrame 的最后2行和最后2列,以及倒数第3行的所有数据。

常见问题

loc 和 iloc 哪个更好用?

两者各有优势。当你知道具体的索引标签名时使用 loc,代码更具可读性;当你按位置选择(如前N行、后N列)时使用 iloc 更方便。实际开发中两者经常结合使用。

loc 切片为什么包含右端点?

因为 loc 基于标签而非位置。对于字符串索引(如 'a':'c'),无法确定 'c' 之后是什么,所以设计为包含右端点更合理。这也是 pandas 有意为之的设计决策。

如何同时使用行条件和列选择?

使用 loc 配合布尔条件:df.loc[df['年龄'] > 25, ['姓名', '薪资']]。第一个参数是行条件(布尔Series),第二个参数是要选择的列名列表。

什么是 SettingWithCopyWarning 警告?

当你试图修改一个可能为视图(view)而非拷贝(copy)的数据时会出现。使用 loc 直接赋值(如 df.loc[条件, '列'] = 值)可以避免这个警告。

标签: loc iloc 数据选择 pandas教程 索引操作 DataFrame

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: pandas DataFrame创建 - 二维数据结构全解析 下一篇: pandas DataFrame筛选过滤 - 条件表达式筛选数据

poll相关推荐