为什么 Pandas 系列切片在使用索引号与索引值进行切片时表现不同?

Why does Pandas Series slicing behave differently when slicing using index numbers versus index values?

遇到这个问题,很好奇为什么使用索引号进行切片的值在最后是独占的,但使用索引值是包含在内的。这是一个简短的可重现示例。如果我使用了不当的术语,我深表歉意。

# start with a pandas series
series = pd.Series(np.arange(5), index=['a', 'b', 'c', 'd', 'e'])

# slicing using index values
series['b':'e']

## returns
| b| 1|
| c| 2|
| d| 3|
| e| 4|

# slicing using index numbers
series[1:4]

## returns
| b| 1|
| c| 2|
| d| 3|

为什么他们 return 的输出不同? 'b':'e' 和系列中的索引 1:4 不一样吗?

不确定之前是否有人回答过这个问题,因此有一个社区 wiki。

根据 Slicing with Labels 文档:

When using .loc with slices, if both the start and the stop labels are present in the index, then elements located between the two (including them) are returned

当您这样做时会发生这种情况:

series['b':'e']

因为我们是按标签而不是位置进行切片的。因此标签是包容性的。

然而,当您使用 iloc 按位置切片时,它的行为有点不同。它考虑了第一个位置并排除了最后一个,非常类似于 python 索引的工作方式

因此 series[1:4] 从切片中排除位置 4。 阅读更多关于 slicing by position

当标签与位置相同时也可以复制:

pd.Series(np.arange(5)).loc[1:4] 

这个 returns 索引 1,2,3,4 而下面的:

pd.Series(np.arange(5))[1:4]

排除指数==4。