python-3.x - Pandas 系列子集索引 2 :-2 doens't work

标签 python-3.x pandas dataframe

我有这个数据框。

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/

相关文章:

Python异步: is the error me or the API?

python - 在 python 中对不相关但形状相似的类进行子类型化的模式

python-3.x - 如何根据data.frame中的两列将data.frame转换为矩阵

python - 根据起始字母从数据框中的列中提取值

python - 如何在按 pandas 数据框中的另一列分组后插入缺失的日期和前向填充列

python - 将重复的句子替换为单词 "same"

python-3.x - 无法逆转 pandas 数据帧中的第一个差异

python - 基类方法的重写方法调用如何工作?

python - cosine_similarity 2 pandas df 列之间的余弦距离

python - 特定列上 Pandas 的滚动平均值