非常棒的学习方向!pandas
中的 df.loc
和 df.iloc
是核心操作之一,掌握它们会让你对 DataFrame 的访问、切片、筛选变得得心应手。
✅ 一文透彻理解 df.loc
和 df.iloc
的区别与用法
🔍 本质区别:基于标签 vs 基于位置
属性 | df.loc | df.iloc |
---|---|---|
访问方式 | 基于标签(label) | 基于整数位置(index) |
支持 | 行标签、列标签 | 行号、列号 |
包括尾部? | 是的,切片包含右端 | 否,切片不含右端 |
是否支持布尔数组 | ✅ 支持 | ✅ 支持 |
🧪 举个例子:准备数据
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 40],
'score': [85.5, 90.0, 78.5, 88.0]
}, index=['a', 'b', 'c', 'd'])
print(df)
输出:
name age score
a Alice 25 85.5
b Bob 30 90.0
c Charlie 35 78.5
d David 40 88.0
✳️ 使用 df.loc[]
:基于标签(index/column 名)
1. 获取单行或多行
df.loc['a'] # 获取标签为 'a' 的那一行
df.loc[['a', 'c']] # 获取多行
2. 行列同时指定
df.loc['a', 'name'] # 'Alice'
df.loc[['a', 'b'], ['age', 'score']] # 多行多列
3. 标签切片(含尾)
df.loc['a':'c'] # 获取 a 到 c 行(包含 c 行)
4. 布尔索引
df.loc[df['age'] > 30] # 获取年龄大于30的行
✳️ 使用 df.iloc[]
:基于位置(整数编号)
1. 获取第 i 行(0 起)
df.iloc[0] # 第 1 行
df.iloc[[0, 2]] # 第 1 行和第 3 行
2. 行列都用位置
df.iloc[0, 0] # 第一行第一列 → 'Alice'
df.iloc[1:3, 1:3] # 行 1 到 2(不含第 3 行),列 1 到 2(不含 3)
3. 布尔数组(适用于行)
df.iloc[[True, False, True, False]]
🎯 常见误区对比
示例 | .loc 结果 | .iloc 结果 |
---|---|---|
df.loc['a'] | 第一行,标签为 ‘a’ 的行 | ❌ 报错(不能用标签) |
df.iloc[0] | ❌ 报错(不能用位置) | 第一行 |
df.loc[0:2] | 选标签 0 到 2 行(标签是数字才行) | 不常用,若 index 是 int 会包含“2” |
df.iloc[0:2] | ❌ 报错 | 正确,选第 0 行和第 1 行 |
🧠 记忆口诀
📌
.loc[]
是 “L”abel 的缩写 —— 用名字
📌.iloc[]
是 “I”ndex 的缩写 —— 用数字
🧪 总结速查表
用法 | loc | iloc |
---|---|---|
单行 | df.loc['a'] | df.iloc[0] |
多行 | df.loc[['a','b']] | df.iloc[[0,1]] |
行列 | df.loc['a', 'age'] | df.iloc[0, 1] |
切片 | df.loc['a':'c'] ✅ 含末尾 | df.iloc[0:3] ❌ 不含末尾 |
布尔 | df.loc[df['age']>30] | df.iloc[[True, False,...]] |
🧪 实战建议
- 若你对行列名字很清楚,用
.loc
- 若你只是操作某个位置或偏移量,用
.iloc
- 不要把
.loc[1]
和.iloc[1]
混用,它们意义完全不同!
发表回复