识别最大值行然后在其他地方使用时出现索引越界错误

Posted

技术标签:

【中文标题】识别最大值行然后在其他地方使用时出现索引越界错误【英文标题】:Index out of bounds error when identifying a maximum value row and then using that elsewhere 【发布时间】:2017-02-04 10:50:10 【问题描述】:

我对编程非常陌生(

我有一个数据表,它取自 csv 文件并编译成 3 列,有几千行。我已经根据某些条件过滤掉了很多行,留下了大约 200 行(但由于初始排序,其索引约为 8000-8300)。现在我正在尝试查找另一列中出现最高值的时间(其中一列)。当我运行下面的代码时,它给了我一个错误“索引超出范围”。我在这里阅读了关于同一错误消息的另一个问题,但我真的不明白如何在这里应用答案。

maxrow=df['A'].idxmax()
maxA=df['A'].irow(maxrow)
maxtime = df['time'].irow(maxrow)
maxB = df['B'].irow(maxrow)

我知道第一行是查找 A 处于最大值的行并分配一个变量“maxrow”来获得该行号。 第二行是创建一个变量 maxA 并将在 A 列的最大行中找到的值分配给它。 然而,在这个阶段,它似乎产生了一个问题。我应该提一下,如果我在第 3 行、第 4 行和第 5 行插入小于 200 的行号而不是“maxrow”,则完全没有问题(除了选择的行不正确)。

所以我认为程序以某种方式根据其索引号识别最大行,但是当涉及到使用它时,它正在使用行的实际新顺序,其中还不够。

有人可以帮忙吗? 谢谢

【问题讨论】:

需要更多minimal reproducible example。 .irow(maxrow) 已弃用,您应该使用.iloc[maxrow] df['A'].loc(maxrow) 有效吗? iloc() 是基于整数的,loc() 是基于标签的。 谢谢!这几乎行得通。它不会抛出任何错误消息,但现在当我打印出“maxrow”和“maxtime”的值时,它会给出“”而不是值。跨度> 顺便说一句,这与我使用 loc() 还是 iloc() 无关。我很想知道在编程环境中“弃用”是什么意思。 【参考方案1】:

这应该解决它:

maxrow = df['A'].idxmax()
maxA = df['A'].loc[maxrow]
maxtime = df['time'].loc[maxrow]
maxB = df['B'].loc[maxrow]

loc的更正确用法:

maxrow = df['A'].idxmax()
maxA = df.loc[maxrow, 'A']
maxtime = df.loc[maxrow, 'time']
maxB = df.loc[maxrow, 'B']

更正确的用法,只需调用loc

maxrow = df['A'].idxmax()
maxA, maxtime, maxB = df.loc[maxrow, ['A', 'time', 'B']]

关于上述 cmets 的几点说明:

loc[] 应该与方括号一起使用,而不是圆括号。这解释了你得到的指针:<pandas.core.indexing._iLocIndexer object at 0x1179d5978>。 您应该为此使用loc,而不是iloc,因为idxmax 返回的索引对应于您的数据帧的索引。在您的情况下,您可能有一个增量索引,所以没关系。我建议阅读文档(loc、iloc)以了解其中的区别。 重新弃用,请参阅this question:“弃用是一种应用于软件功能的状态,表明应避免使用它们”。

【讨论】:

以上是关于识别最大值行然后在其他地方使用时出现索引越界错误的主要内容,如果未能解决你的问题,请参考以下文章

如何修复在cshtml视图中的两个地方使用时mentionsInput插件不起作用

在 Ruby 中,获取数组中最大值的索引的最简洁方法是啥?

求助大神,命令行选项语法错误,怎么解决

如何测试索引越界错误? [复制]

java字符串索引越界

MySQL索引的使用