为何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
相关产品推荐
相关产品推荐

