我有这个数据框。
dd = pd.DataFrame({'t': np.array(['a','b', 'c', 'd', 'e', 'f', 'g']),
'o': np.array([1,2,3,4,5,6,7])})
我不明白为什么会这样:
print(dd.loc[2:4, 'o'].values)
[3, 4, 5]
这不是:
print(dd.loc[2:-2, 'o'].values)
[]
虽然这样做:
print(dd[['o']][2:-2].values)
[[3]
[4]
[5]]
最佳答案
为什么 dd.loc[2:4, 'o'].values 有效
.loc[]
使用 label slicing ,其中标签被视为非单调的,因此 require exact matches . Endpoints are inclusive .
因此,在.loc[]
中,2:4
被解释为2:4:1(含)
。因此,选择了 index = 2、3 和 4
的行。
dd.loc[2:-2, 'o'].values 是如何工作的
出于与上述相同的推理,.loc[]
中的 2:-2
不会转换为可识别长度的 2:len(dd) -2:1
如预期。这是因为 2
和 -2
被视为标称标签,因此切片表达式不会是长度感知的。它将被解释为 2:-2:1(含)
而不是 2:len(dd)-2:1(含)
。
但是,由于第一个元素2已经越过终点(2 > -2)的边界,所以不会选择任何元素。这会导致一个空数据框。
dd[2:-2]
这叫做 slicing ranges .
取自文档:
- 在“按位置选择”部分详细介绍了 .iloc 方法,描述了沿任意轴对范围进行切片的最稳健和一致的方法。
- 对于 Series,语法与 ndarray 完全一样
- 使用 DataFrame,在
[]
内部切片 切片行。
所以它只是一种使用 .iloc[]
进行 ndarray 样式行选择的便捷方式,它知道 2:-2
表示 2:len( dd)-2:1
(端点除外)。因此,选择了 index=2,3,4
的行。
dd[['o']][2:-2]
也返回与 dd[2:-2]
相同的行,因为 dd[ ['o']]
是具有相同索引的数据框。
关于python-3.x - Pandas 系列子集索引 2 :-2 doens't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66964342/