【问题标题】:Functionality of iloc and simply [ ] in a seriesiloc 的功能和简单的 [ ] 系列
【发布时间】:2021-01-04 07:56:29
【问题描述】:

我认为 pandas 是一个系列 S S[0:2] 相当于 s.iloc[0:2] ,在这两种情况下都会有两行但最近我遇到了麻烦The first picture shows the expected output 但我不知道In this picture S[0] is showing error i don't know why 出了什么问题

【问题讨论】:

    标签: pandas data-science data-analysis


    【解决方案1】:

    我可以尝试解释一下这种行为。在 Pandas 中,您可以通过positionlabel 进行选择,重要的是要记住每一行/列将始终有一个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]
    

    您正在切片按位置(文档中的this section 解释说它等同于.iloc。但是,当您运行时

    s[0]
    

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

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

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

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

    Indexing Best Practices in Pandas.series

    Retrieving values in a Series by label or position

    【讨论】:

    • 但是当我再次使用 s.index = ['hi','hello','i','my'] 更改索引时,我看到索引是 ** Index([ 'hi', 'hello', 'my', 'I'], dtype='object') ** 和 s[0] 应该给出错误,因为你说熊猫会寻找不存在的标签 0,但是没有发生,我得到 s[0] 的值,没有任何错误
    • 嗨@PrashantJoshi,我更新了我的答案以解释熊猫如何解释索引将取决于您的数据是否具有integerstring 标签。我想是因为所有这些意想不到的行为,他们总是建议明确使用.iloc.loc
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2011-01-25
    • 2010-09-13
    相关资源
    最近更新 更多