You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Pandas中.loc切片上界为包含性,.iloc为排他性?

为什么Pandas里.loc和.iloc的切片上界行为不一样?

这个问题其实是Pandas针对两种索引逻辑的刻意设计,咱们结合你的例子和两种方法的定位来拆解:

首先先回顾你给出的代码片段,方便对照:

import pandas as pd
df = pd.DataFrame(dict(A=range(3), B=range(3)))
df.iloc[:1]
#    A  B
# 0  0  0
df.loc[:1]
#    A  B
# 0  0  0
# 1  1  1

1. .iloc:和Python原生切片逻辑对齐

.iloc是基于整数位置的索引,它的设计完全贴合Python原生序列(比如列表、字符串)的切片规则——切片的上界是排他性的。

比如你在Python里写[0,1,2][:1],得到的是[0];range(3)[:1]得到的是range(0,1)。Pandas这么设计是为了让熟悉Python基础语法的用户无缝上手,不用重新适应新的切片规则。

在你的例子里,df.iloc[:1]就是取“位置0到位置1之前”的行,也就是只有位置0的那一行。

2. .loc:贴合标签索引的语义需求

.loc是基于行标签的索引,它的切片上界是包含性的,这是为了适配标签索引的核心场景:按标签的范围选取数据,不管标签是不是连续的整数。

举个例子,如果你的行标签不是连续整数,而是['x', 'y', 'z'],那么df.loc['x':'z']肯定是要包含从x到z的所有行,这符合我们“选取某段标签区间”的直觉。哪怕标签是整数但不连续(比如行标签是[0,2,4]),df.loc[0:4]也会把标签0、2、4的行都取出来,而不是只取到标签4之前的行。

回到你的例子,行标签刚好是连续的0、1、2,所以df.loc[:1]就会包含标签0和1的所有行。

简单总结:

  • .iloc跟着Python原生切片走,上界排他,适配位置操作;
  • .loc跟着标签语义走,上界包含,适配标签范围选取。

内容的提问来源于stack exchange,提问作者James Ko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:47:31