为什么 `loc` 切片是「闭区间」,而不是遵循列表切片的「左开右闭」?
data.loc[0:2, ['a','b']] 不是指 0 行和 1 行,而是指 行标签从 0 到 2(包含 2)的所有行,也就是 0、1、2 三行。
下面我将从设计理念和具体用法,帮你彻底搞懂 loc 的切片逻辑。
一、为什么 loc 切片是「闭区间」?
loc 的设计初衷是 “基于标签(label)的精准索引”,而不是基于“位置偏移”。
- 如果标签是整数(比如
0, 1, 2, 3),loc[0:2]会忠实地包含 标签为0、1、2的所有行。 - 如果标签是字符串(比如
'A', 'B', 'C', 'D'),loc['A':'C']会包含 标签从'A'到'C'的所有行。
这种设计可以避免以下问题:
- 当标签不连续时:比如标签是
[1,3,5,7],如果loc[1:5]按数组切片(左闭右开),结果会是空的,这不符合直觉。 - 当标签是日期时:比如
loc['2025-01-01':'2025-01-31'],你肯定希望包含整个 1 月份的数据。
二、loc 与 iloc 的核心区别
为了更清晰地对比,我们用一个表格总结:
| 方法 | 索引方式 | 切片逻辑 | 示例 | 结果 |
|---|---|---|---|---|
loc |
基于标签(label) | 闭区间 [start, end] |
loc[0:2] |
包含标签 0, 1, 2 的行(3行) |
iloc |
基于位置(position) | 左闭右开 [start, end) |
iloc[0:2] |
包含位置 0, 1 的行(2行) |
三、设计哲学:标签 vs 位置
-
iloc:是integer location的缩写,它的切片逻辑和 Python 列表、NumPy 数组完全一致。- 如果你习惯 Python 的
list[0:2],就用iloc。
- 如果你习惯 Python 的
-
loc:是location的缩写,它的核心是“按标签取值”。- 标签可以是任意类型(整数、字符串、日期等)。
- 为了让用户能直观地选取一个连续的标签范围,
loc的切片设计成了闭区间。
四、一个生动的例子
假设你有如下 DataFrame:
name age
A 张三 25
B 李四 30
C 王五 35
D 赵六 40
df.loc['A':'C']→ 会返回A、B、C三行。df.iloc[0:2]→ 会返回第 0 行、第 1 行(即A、B)。
五、总结
loc 的切片逻辑是为了 “让标签索引更直观、更符合人类思维”。
- 如果你需要 按位置 切片,用
iloc。 - 如果你需要 按标签 切片,用
loc。
这种设计虽然和数组切片不同,但在处理非连续标签、字符串标签或日期标签时,能避免很多混乱。

浙公网安备 33010602011771号