In [19]: dfrm
Out[19]:
A B C
a 0.143693 0.653810 0.586007
b 0.623582 0.312903 0.919076
c 0.165438 0.889809 0.000967
d 0.308245 0.787776 0.571195
e 0.870068 0.935626 0.606911
f 0.037602 0.855193 0.728495
g 0.605366 0.338105 0.696460
h 0.000000 0.090814 0.963927
i 0.688343 0.188468 0.352213
i 0.879000 0.105039 0.900260
In [20]: dfrm['A'].idxmax()
Out[20]: 'i'
In [21]: dfrm.iloc[dfrm['A'].idxmax()] # .ix instead of .iloc in older versions of pandas
Out[21]:
A B C
i 0.688343 0.188468 0.352213
i 0.879000 0.105039 0.900260
In [1]: from pandas import Series, DataFrame
In [2]: s=Series([2,4,4,3],index=['a','b','c','d'])
In [3]: s.idxmax()
Out[3]: 'b'
In [4]: s[s==s.max()]
Out[4]:
b 4
c 4
dtype: int64
您只需要} )函数。很简单:
argmax()
(现在称为^{此函数已更新为Pandas API中的名称
idxmax
,尽管从Pandas 0.16开始,argmax
仍然存在并执行相同的函数(尽管运行速度似乎比idxmax
慢)。您也可以使用
numpy.argmax
,例如numpy.argmax(df['A'])
——它提供了与两个pandas
函数中任何一个相同的功能,并且在粗略的观察中显示的速度至少与idxmax
一样快。以前(如注释中所述),似乎
argmax
将作为一个单独的函数存在,该函数在最大元素行位置的索引内提供整数位置。例如,如果将字符串值作为索引标签,如行“a”到“e”,则可能需要知道最大值出现在行4(而不是行“d”)中。然而,在pandas 0.16中,上面列出的所有方法都只为所讨论的行提供Index
中的标签,如果您想要该标签在Index
中的位置整数,则必须手动获取它(现在允许重复的行标签,这可能很棘手)。总的来说,我认为这三种方法(
argmax
,它仍然存在,idxmax
,和numpy.argmax
)都会出现类似于idxmax
的行为,这是一件坏事,因为需要最大值的位置整数位置是非常常见的,甚至比在某个索引中需要该位置的标签更常见,尤其是在重复行标签很常见的应用程序中。例如,考虑这个具有重复行标签的玩具
DataFrame
:因此这里单纯使用
idxmax
是不够的,而旧形式的argmax
将正确地提供最大行的位置位置(在本例中是位置9)。这正是动态类型语言中那些令人讨厌的、容易出错的行为之一,这使得这类事情变得如此不幸,值得一搏。如果您正在编写系统代码,而您的系统突然在某些数据集上使用,这些数据集在连接之前没有得到正确的清理,那么很容易出现重复的行标签,特别是字符串标签,如金融资产的CUSIP或SEDOL标识符。您不能很容易地使用类型系统来帮助您,并且您可能无法在不遇到意外丢失的数据的情况下强制索引的唯一性。
所以你只希望你的单元测试覆盖了所有的东西(他们没有,或者更可能没有人写任何测试),否则(最有可能)你只需要等着看你是否碰巧在运行时遇到了这个错误,在这种情况下,您可能需要从输出结果的数据库中删除许多小时的工作,在IPython中,您的头撞在墙上试图手动重现问题,最后发现这是因为
idxmax
只能报告max行的标签,然后对没有标准函数会自动为您获取max行的位置,自己编写一个错误实现,编辑代码,并祈祷您不再遇到问题。如果有多个行取最大值,则上述两个答案将只返回一个索引。如果你想要所有的行,似乎没有函数。 但这并不难。下面是Series的一个示例;DataFrame也可以这样做:
您也可以尝试
idxmax
:例如
相关问题 更多 >
编程相关推荐