使用熊猫
idxmax功能。很简单:
>>> import pandas>>> import numpy as np>>> df = pandas.Dataframe(np.random.randn(5,3),columns=['A','B','C'])>>> df A B C0 1.232853 -1.979459 -0.5736261 0.140767 0.394940 1.0688902 0.742023 1.343977 -0.5797453 2.125299 -0.649328 -0.2116924 -0.187253 1.908618 -1.862934>>> df['A'].argmax()3>>> df['B'].argmax()4>>> df['C'].argmax()1
或者,您也可以使用
numpy.argmax
,例如numpy.argmax(df['A'])
-它提供相同的功能,并且至少与idxmax
粗略观察中的显示速度一样快。idxmax()
返回索引标签,而不是整数。- 示例”:如果您将字符串值作为索引标签,例如行“ a”至“ e”,则可能想知道最大值出现在第4行(而不是“ d”行)。
- 如果您希望该标签在其中的整数位置,则
Index
必须手动获取它(由于允许使用重复的行标签,因此可能很棘手)。
历史记录:
idxmax()
以前在0.11之前被调用argmax()
argmax
在1.0.0之前弃用,并在1.0.0中完全删除- 从Pandas 0.16开始,它
argmax
曾经存在并执行相同的功能(尽管运行速度比慢idxmax
)。argmax
函数返回最大元素的行位置的索引内的 整数位置 。- 熊猫开始使用行标签代替整数索引。 位置整数索引曾经很常见,比标签更常见,特别是在重复行标签很常见的应用程序中。
例如,考虑以下
Dataframe带有重复行标签的玩具:
In [19]: dfrmOut[19]:A B Ca 0.143693 0.653810 0.586007b 0.623582 0.312903 0.919076c 0.165438 0.889809 0.000967d 0.308245 0.787776 0.571195e 0.870068 0.935626 0.606911f 0.037602 0.855193 0.728495g 0.605366 0.338105 0.696460h 0.000000 0.090814 0.963927i 0.688343 0.188468 0.352213i 0.879000 0.105039 0.900260In [20]: dfrm['A'].idxmax()Out[20]: 'i'In [21]: dfrm.iloc[dfrm['A'].idxmax()] # .ix instead of .iloc in older versions of pandasOut[21]:A B Ci 0.688343 0.188468 0.352213i 0.879000 0.105039 0.900260
因此,单单使用
idxmax不足以提供足够的信息,而旧形式的
argmax可以正确提供最大行的 位置 (在这种情况下为位置9)。
这恰恰是动态类型语言中那些容易发生错误的令人讨厌的行为之一,这种行为使这种事情非常不幸,值得一搏。如果您正在编写系统代码,并且系统突然被用于某些在加入之前未正确清理的数据集,则很容易以重复的行标签结尾,尤其是字符串标签,例如金融资产的CUSIP或SEDOL标识符。您不能轻松地使用类型系统来帮助您,并且可能无法在索引上强制唯一性而不遇到意外丢失的数据。
因此,您只希望单元测试能够覆盖所有内容(它们没有,或者很可能没有人编写任何测试)-否则(很可能)您只剩下等着看是否碰巧遇到了这个问题运行时错误,在这种情况下,你可能不得不去从你输出结果,碰你的头反对IPython的墙试图手动重现问题数据库中删除多个小时的工作价值,终于搞清楚,这是因为
idxmax可以
只 报告最大行的 标签 ,然后对没有标准函数自动为您获取最大行的 位置 感到失望,自己编写一个有问题的实现,编辑代码,并祈祷您不再遇到问题。



