我对编程非常陌生(< 2周),并且我必须学习Python3作为课程的一部分,所以请在任何答案中牢记这一点!我正在开发新的Mac,以防万一。
我有一个数据表,它是从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行最大行中找到的值。 但是,在这个阶段,它似乎造成了一个问题。我应该提一下,如果我插入一个小于200的行号而不是" maxrow"在第3行,第4行和第5行,根本没有问题(除了它不是选择的右行)。
所以我认为程序在某种程度上是基于其索引号来识别最大行,但是当它使用它时,它正在使用行的实际新排序,其中还不够。
有人可以帮忙吗? 感谢
答案 0 :(得分:0)
这应解决它:
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']]
关于上述评论的一些注释:
loc[]
应与方括号一起使用,而不是圆括号。这解释了你得到的指针:<pandas.core.indexing._iLocIndexer object at 0x1179d5978>
。loc
而不是iloc
,因为idxmax
会返回与您的数据框索引相对应的索引。在您的情况下,您可能有一个增量索引,所以它并不重要。我建议您阅读文档(loc,iloc)以了解其中的差异。