首页 > 解决方案 > 为什么 Pandas Series 切片在使用索引号和索引值进行切片时表现不同?

问题描述

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

# 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|

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

标签: pythonpython-3.xpandasseries

解决方案


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

根据带有标签的切片文档:

将 .loc 与切片一起使用时,如果索引中同时存在开始和停止标签,则返回位于两者之间的元素(包括它们)

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

series['b':'e']

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

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

因此series[1:4]从切片中排除位置 4。阅读有关按位置切片的更多信息

当标签与位置相同时,也可以复制这一点:

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

这将返回索引 1,2,3,4 而以下:

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

不包括索引==4。


推荐阅读