在Pandas DataFrame中查找列的值最大的行


208

如何找到特定列的值最大的行

df.max() 会给我每列的最大值,我不知道如何获取对应的行。


是否有可能获得前2个值?而不是最大?
AsheKetchum

5
您可以使用sort_values并获取索引:df.sort_values('col', ascending=False)[:2].index
lazy1

2
lazy1:避免不必要地对整个序列进行排序,因为平均而言它为O(N logN),而找到max / idxmax仅为O(N)。
smci

Answers:


240

使用熊猫idxmax功能。很简单:

>>> import pandas
>>> import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])
>>> df
          A         B         C
0  1.232853 -1.979459 -0.573626
1  0.140767  0.394940  1.068890
2  0.742023  1.343977 -0.579745
3  2.125299 -0.649328 -0.211692
4 -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]: 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

因此,单单使用idxmax不足以达到此目的,而旧形式的argmax可以正确提供最大行的位置(在这种情况下为位置9)。

这恰恰是动态类型语言中那些容易发生错误的令人讨厌的行为之一,这种行为使这种事情非常不幸,值得一搏。如果您正在编写系统代码,而系统突然被用于某些在加入之前未正确清理的数据集,则很容易以重复的行标签结尾,尤其是字符串标签,例如金融资产的CUSIP或SEDOL标识符。您无法轻松地使用类型系统来帮助您,并且可能无法在索引中意外丢失数据而无法对索引实施唯一性。

因此,您只希望单元测试能够覆盖所有内容(它们没有,或者很可能没有人编写任何测试)-否则(很可能)您只需要等待,看看是否碰巧遇到了这个问题运行时错误,在这种情况下,你可能不得不去从你输出结果,碰你的头反对IPython的墙试图手动重现问题数据库中删除多个小时的工作价值,终于搞清楚,这是因为idxmax可以报告最大行的标签,然后感到失望的是,没有标准函数会自动为您获取最大行的位置,您自己编写一个有问题的实现,编辑代码,并祈祷您不再遇到问题。


13
根据那里的倒数第二条注释,它看起来像argmin并且argmax将保留在其中,DataFrame而区别仅在于您是要索引还是标签。idxmax将为您提供最大位置的标签。argmax将为您提供索引整数本身。
2013年

4
提供解释之间差异的信息argmaxidxmax,以及如何避免重复与虫子指数是伟大的!在我读完另一个答案中的评论之前,我一直没有注意到。谢谢!
tupan

关于您要实现的用途,Pandas 0.24.1指出以下内容:“ argmax将来会纠正的行为以返回最大位置。现在,使用series.values.argmaxnp.argmax(np.array(values))获取最大行的位置。
山姆

1
同样,.ix第二个示例的方法已重命名为.iloc
Ma0

如果您的列仅包含nan值,则将导致TypeError
Max Segal

77

您也可以尝试idxmax

In [5]: df = pandas.DataFrame(np.random.randn(10,3),columns=['A','B','C'])

In [6]: df
Out[6]: 
          A         B         C
0  2.001289  0.482561  1.579985
1 -0.991646 -0.387835  1.320236
2  0.143826 -1.096889  1.486508
3 -0.193056 -0.499020  1.536540
4 -2.083647 -3.074591  0.175772
5 -0.186138 -1.949731  0.287432
6 -0.480790 -1.771560 -0.930234
7  0.227383 -0.278253  2.102004
8 -0.002592  1.434192 -1.624915
9  0.404911 -2.167599 -0.452900

In [7]: df.idxmax()
Out[7]: 
A    0
B    8
C    7

例如

In [8]: df.loc[df['A'].idxmax()]
Out[8]: 
A    2.001289
B    0.482561
C    1.579985

谢谢韦斯。:文档idxmax()这里pandas.pydata.org/pandas-docs/dev/generated/...
威尔

df.ix[df['A'].idxmax()].values抢我想要的数组。仍然有效。
Yojimbo,2015年

2
请注意,您需要谨慎尝试将的输出idxmax用作进纸器ixloc对数据进行切片和/或获取最大行的位置的方法。因为您可以在Index-中进行重复-请参阅我的答案的更新以获取示例。
2015年

25

如果有多行取最大值,上述两个答案都只会返回一个索引。如果要所有行,似乎没有功能。但这并不难。以下是系列的示例;对于DataFrame也可以这样做:

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

10
谢谢!版本的DataFrame:df[df['A'] == df['A'].max()]
Dennis Golomazov,2016年

这是实际正确的答案(DataFrame版本)。
gented


4

直接的“ .argmax()”解决方案对我不起作用。

@ely提供的上一个示例

>>> import pandas
>>> import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])
>>> df
      A         B         C
0  1.232853 -1.979459 -0.573626
1  0.140767  0.394940  1.068890
2  0.742023  1.343977 -0.579745
3  2.125299 -0.649328 -0.211692
4 -0.187253  1.908618 -1.862934
>>> df['A'].argmax()
3
>>> df['B'].argmax()
4
>>> df['C'].argmax()
1

返回以下消息:

FutureWarning: 'argmax' is deprecated, use 'idxmax' instead. The behavior of 'argmax' 
will be corrected to return the positional maximum in the future.
Use 'series.values.argmax' to get the position of the maximum now.

所以我的解决方案是:

df['A'].values.argmax()


1

idmax数据帧的返回与最大值和行为的行的标记指数argmax取决于版本pandas(现在它返回警告)。如果要使用位置索引,可以执行以下操作:

max_row = df['A'].values.argmax()

要么

import numpy as np
max_row = np.argmax(df['A'].values)

请注意,如果您使用的np.argmax(df['A'])行为与相同df['A'].argmax()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.