查找pandas DataFram中列值最大的行

2024-04-23 08:49:32 发布

您现在位置:Python中文网/ 问答频道 /正文

如何查找特定列的值为最大值的行?

df.max()将为每个列提供最大值,我不知道如何获取相应的行。


Tags: dfmax
3条回答

您只需要argmax()现在称为^{})函数。很简单:

>>> 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

此函数已更新为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

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只能报告max行的标签,然后对没有标准函数会自动为您获取max行的位置,自己编写一个错误实现,编辑代码,并祈祷您不再遇到问题。

如果有多个行取最大值,则上述两个答案将只返回一个索引。如果你想要所有的行,似乎没有函数。 但这并不难。下面是Series的一个示例;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

您也可以尝试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

相关问题 更多 >