python - 为什么 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
吗?
解决方案
不确定之前是否已经回答过这个问题,因此有一个社区 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。
推荐阅读
- javascript - Expo React-Native 向 Mapview 添加标记会导致 App 忽略进一步的输入?
- regex - 如何将文本样式更改为 vba foreach 循环
- java - 如何调试 conscrypt 连接
- vue.js - 计算属性未在道具更改时更新
- c# - 为什么我得到 XML Parsing Error: no root element found(即使我比较像 Inner Exception 要求的原始类型)?
- ruby - 如何在 Linux 上更改 ruby 版本
- laravel - Laravel,简单而正确的关系方式
- c# - 使用 autofac 在业务逻辑层从信号器请求中提供用户信息
- javascript - 如何将ejs模板代码转换为jade模板代码?
- sockets - 如何在linux上保留tcp源端口?