为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英4014372 2019-09-19 16:36:17
如何找到特定列的值最大的行?df.max() 会给我每列的最大值,我不知道如何得到相应的行。
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

你只需要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

此功能已更新为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仍然存在,idxmax和numpy.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.ix[dfrm['A'].idxmax()]

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可以只报告最大行的标签,然后感到失望的是没有标准函数自动获取最大行的位置,自己编写一个错误的实现,编辑代码,并祈祷你不再遇到问题。


查看完整回答
反对 回复 2019-09-19
?
慕容森

TA贡献1853条经验 获得超18个赞

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


查看完整回答
反对 回复 2019-09-19
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 13786 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信