pin_drop当前位置:知识文库 ❯ 图文
pandas DataFrame选择数据 - loc与iloc详解
目录
一、loc与iloc概述
在 pandas 中,loc 和 iloc 是 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 原生切片一致。
四、参数说明
五、代码示例
示例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 基于整数位置选择
-
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[条件, '列'] = 值)可以避免这个警告。
本文涉及AI创作
内容由AI创作,请仔细甄别