Pandas DataFrame - 查找列的值最大的行

laz*_*zy1 196 python pandas argmax

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

df.max() 会给我每列的最大值,我不知道如何得到相应的行.

ely*_*ely 218

你只需要argmax()(现在称为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
Run Code Online (Sandbox Code Playgroud)

此功能已更新为idxmaxPandas API中的名称,但从Pandas 0.16开始,argmax仍然存在并执行相同的功能(尽管看起来比运行速度慢idxmax).

您也可以使用numpy.argmax,例如numpy.argmax(df['A'])- 它提供与两个pandas函数中的任何一个相同的东西,并且看起来至少与idxmax粗略观察中一样快.

以前(如评论中所述)它似乎argmax作为单独的函数存在,其在最大元素的行位置的索引内提供整数位置.例如,如果您将字符串值作为索引标签,例如行'a'到'e',您可能想知道最大值出现在第4行(而非行'd').然而,在大熊猫0.16,所有上面只列出的方法提供的标签,Index有问题的行,如果你希望中的那个标签的位置整数Index你必须手动得到它(这可能会非常棘手,现在重复允许行标签).

一般来说,我认为idxmax所有三种方法(argmax仍然存在,idxmaxnumpy.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
Run Code Online (Sandbox Code Playgroud)

所以这里天真的使用idxmax是不够的,而旧的形式argmax将正确地提供最大行的位置位置(在这种情况下,位置9).

这正是动态类型语言中那些令人讨厌的容易出错的行为之一,这使得这类事情变得如此不幸,值得打败死马.如果您正在编写系统代码,并且您的系统突然被用于某些在加入之前未正确清理的数据集,则很容易最终出现重复的行标签,尤其是字符串标签,如金融资产的CUSIP或SEDOL标识符.您无法轻松使用类型系统来帮助您,并且您可能无法在索引上强制执行唯一性而不会遇到意外丢失的数据.

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

  • 根据https://github.com/pydata/pandas/issues/2970,argmax现在是idxmax.就像我做的那样,把评论留给那些偶然发现这个问题的人. (45认同)
  • 基于倒数第二个评论,它看起来像`argmin`和`argmax`将仍然是`DataFrame`的一部分,区别在于你是否想要索引或标签.`idxmax`将为您提供最大值发生位置的标签.`argmax`会给你索引整数本身. (13认同)
  • 提供的信息解释了'argmax`和`idxmax`之间的区别,以及如何避免重复索引的错误很棒!我没有注意到,直到我在另一个答案中读到你的评论.谢谢! (4认同)

Wes*_*ney 71

您也可以尝试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
Run Code Online (Sandbox Code Playgroud)

例如

In [8]: df.loc[df['A'].idxmax()]
Out[8]: 
A    2.001289
B    0.482561
C    1.579985
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您需要小心尝试将`idxmax`的输出用作`ix`或`loc`的馈线,作为对数据进行子切片和/或获取max-row的位置位置的方法.因为你可以在`索引`中有重复项 - 请参阅我的答案的更新以获取示例. (2认同)

小智 22

如果有多行采用最大值,则上述两个答案都只返回一个索引.如果你想要所有的行,似乎没有一个功能.但这并不难.以下是系列的示例; 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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!DataFrame的版本:`df [df ['A'] == df ['A'].max()]` (6认同)

小智 15

使用query() 的更紧凑和可读的解决方案如下:

import pandas as pd

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

# find row with maximum A
df.query('A == A.max()')
Run Code Online (Sandbox Code Playgroud)

它还返回一个 DataFrame 而不是 Series,这对于某些用例来说会很方便。


naj*_*eem 10

如果您想要整行而不仅仅是id,您可以使用df.nlargest并传入您想要的“顶部”行数,您还可以传入您想要的列。

df.nlargest(2,['A'])
Run Code Online (Sandbox Code Playgroud)

将为您提供与 的前 2 个值对应的行A

用于df.nsmallest最小值。


Naf*_*shi 8

df.iloc[df['columnX'].argmax()]
Run Code Online (Sandbox Code Playgroud)

argmax()将提供与columnX的最大值对应的索引.iloc可用于获取此索引的DataFrame df行.


小智 5

很简单:我们有如下的 df ,我们想在 C 中打印具有最大值的行:

A  B  C
x  1  4
y  2  10
z  5  9
Run Code Online (Sandbox Code Playgroud)

在:

df.loc[df['C'] == df['C'].max()]   # condition check
Run Code Online (Sandbox Code Playgroud)

出去:

A B C
y 2 10
Run Code Online (Sandbox Code Playgroud)