0

我认为在熊猫系列 S S[0:2] 相当于 s.iloc[0:2] ,在这两种情况下都会有两行但最近我遇到了麻烦第一张图片显示了预期的输出 ,但我没有不知道在这张图片中出了什么问题S[0] 显示错误我不知道为什么

4

1 回答 1

0

我可以尝试稍微解释一下这种行为。在 Pandas 中,您可以选择 byposition或 by label,重要的是要记住每一行/列总是有一个position“名称”和一个label名称。在列的情况下,这种区别通常很容易看出,因为我们通常给列提供字符串名称。当您使用显式.iloc.loc切片时,差异也很明显。最后s[X]indexing,也s[X:Y]就是slicing,两个动作的行为是不同的。

例子:

df = pd.DataFrame({'a':[1,2,3], 'b': [3,3,4]})
df.iloc[:,0]
df.loc[:,'a']

两者都会返回

0    1
1    2
2    3
Name: a, dtype: int64

现在,在您的情况下发生的事情是您在声明时覆盖了索引名称s.index = [11,12,13,14]。您可以通过在此更改之前和之后检查索引来看到这一点。之前,如果你运行s.index,你会看到它是一个RangeIndex(start=0, stop=4, step=1). 更改索引后,它变为Int64Index([11, 12, 13, 14], dtype='int64').

为什么这很重要?因为尽管您覆盖了labels索引的 ,但它们中的每一个的位置仍然与以前相同。所以,当你打电话

s[0:2]

您正在按位置切片(文档中的本节说明它等效于.iloc。但是,当您运行

s[0]

Pandas 认为您想通过 选择label,因此它开始寻找label不再存在的 0,因为您覆盖了它。在选择数据框列的上下文中考虑方括号选择:您会说df["column"](所以您要求列 by label),所以在系列的上下文中也是如此。

总之,系列索引会发生以下情况:

  • 如果您使用字符串索引标签,并且您按 an 进行索引string,Pandas 将查找字符串标签。
  • 如果您使用字符串索引标签,并且您按 aninteger进行索引,Pandas 将退回到按位置索引(这就是您在评论中的示例有效的原因)。
  • 如果您使用整数索引标签,并且您按 an进行索引integer,Pandas 将始终尝试按“标签”进行索引(这就是第一种情况不起作用的原因,因为您已经覆盖了label0)。

这里有两篇文章解释了这种奇怪的行为:

Pandas.series 中的索引最佳实践

按标签或位置检索系列中的值

于 2020-09-18T07:30:43.540 回答