“IndexError:位置索引器超出范围”,当它们明显不是时

Posted

技术标签:

【中文标题】“IndexError:位置索引器超出范围”,当它们明显不是时【英文标题】:"IndexError: positional indexers are out-of-bounds" when they're demonstrably not 【发布时间】:2017-10-22 17:06:33 【问题描述】:

这是我正在使用的一些代码的 MWE。我通过切片和一些条件慢慢减少初始数据帧,直到我只有我需要的行。每五行的块实际上代表一个不同的对象,因此,当我减少事情时,如果每五行中的任何一行符合标准,我想保留它——这就是 keep.index 上的循环所完成的。无论如何,当我完成后,我可以看到我想要的最终索引存在,但我收到一条错误消息,说“IndexError:位置索引器超出范围”。这里发生了什么?

import pandas as pd
import numpy as np

temp = np.random.rand(100,5)

df = pd.DataFrame(temp, columns=['First', 'Second', 'Third', 'Fourth', 'Fifth'])

df_cut = df.iloc[10:]

keep = df_cut.loc[(df_cut['First'] < 0.5) & (df_cut['Second'] <= 0.6)]

new_indices_to_use = []
for item in keep.index:
    remainder = (item % 5)
    add = np.arange(0-remainder,5-remainder,1)
    inds_to_use = item + add
    new_indices_to_use.append(inds_to_use)

new_indices_to_use = [ind for sublist in new_indices_to_use for ind in sublist]
final_indices_to_use = []
for item in new_indices_to_use:
    if item not in final_indices_to_use:
        final_indices_to_use.append(item)

final = df_cut.iloc[final_indices_to_use]

【问题讨论】:

您是否尝试过打印final_indices_to_use 并验证它是您认为的那样?在您的示例中,我得到[10, 11, ..., 98, 99]len(df_cut) 给出90 我不确定是否投票关闭作为错字,但在我看来你应该在最后一行使用.loc 而不是.iloc -- @987654328 @ 用于位置访问,但您需要基于标签的访问。 嗯,在我的 MWE 中,将其更改为 .loc 确实可以解决问题。我必须检查它是否适用于我的实际代码——我可以发誓我已经尝试过了。为什么 .iloc 不在这里?这些是索引,.iloc 的描述说它接受索引列表。 另外,如果我使用相反的条件然后执行 final = df_cut.drop(df_cut.index[final_indices_to_use]),我会得到同样的错误。 因为df_cut的长度为90;高于89 的索引将给出IndexError 【参考方案1】:

来自 .iloc 上的 Pandas 文档(强调我的):

Pandas 提供了一套方法来获得基于整数的索引。语义紧跟 python 和 numpy 切片。这些是基于 0 的索引

你试图通过标签来使用它,这意味着你需要.loc

从你的例子:

>>>print df_cut.iloc[89]
...
Name: 99, dtype: float64

>>>print df_cut.loc[89]
...
Name: 89, dtype: float64

【讨论】:

多年后,来自其他人:谢谢。

以上是关于“IndexError:位置索引器超出范围”,当它们明显不是时的主要内容,如果未能解决你的问题,请参考以下文章

当它说“无法处理事件”时是啥意思?

Cocoa:当它在NSButton上时更改光标

当它不可能是真的时,为啥我会收到这个错误?

解释当它嵌套时返回给我

如何解决流明迁移?当它返回我这个

当它在 而不是 [] 中时,我如何从 api 中获取东西