pandasDataFrame – 查找列的值是最大的行
我怎样才能find一个特定列的值是最大的行 ?
df.max()
会给我每个列的最大值,我不知道如何得到相应的行。
你只需要argmax()
( 现在叫做idxmax
)函数。 这很简单:
>>> import pandas >>> import numpy as np >>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C']) >>> df ABC 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
这个名字,尽pipe从Pandas 0.16开始, argmax
仍然存在并且执行相同的function(虽然看起来运行速度比idxmax
慢)。
你也可以使用numpy.argmax
,比如numpy.argmax(df['A'])
,它和两个pandas
函数中的任何一个都提供了相同的function,并且在粗略的观察中至less和idxmax
一样快。
之前(如注释中所述),看起来argmax
会作为一个单独的函数存在,它提供了最大元素的行位置的索引内的整数位置 。 例如,如果将string值作为索引标签,如行“a”到“e”,则可能需要知道最大值出现在第4行(而不是行“d”)中。 然而,在pandas0.16中,上面列出的所有方法只提供Index
中所涉及行的标签 ,如果您想在Index
中find该标签的位置整数,您必须手动获取它(现在可能会非常棘手重复行标签是允许的)。
总的来说,我认为所有三种方法( argmax
,仍然存在, idxmax
和numpy.argmax
)都采用numpy.argmax
是一件坏事,因为要求位置整数最大限度地甚至比想要在某个索引内定位位置的标签更常见,特别是在重复行标签是常见的应用中。
例如,考虑这个玩具数据DataFrame
与重复的行标签:
In [19]: dfrm Out[19]: ABC 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]: ABC i 0.688343 0.188468 0.352213 i 0.879000 0.105039 0.900260
所以这里idxmax
的天真使用是不够的,而argmax
的旧forms将正确地提供最大行(在这种情况下,位置9)的位置位置。
这恰恰是dynamictypes语言中那些令人讨厌的错误行为之一,使得这类事情如此不幸,值得打死一场。 如果您正在编写系统代码,并且您的系统突然在一些未正确清理的数据集上被使用,那么很容易导致重复的行标签,特别是string标签(如金融资产的CUSIP或SEDOL标识符)。 您不能轻易地使用types系统来帮助您,并且您可能无法在索引上实施唯一性,而不会意外丢失数据。
所以你只希望你的unit testing覆盖了一切(他们没有,或者更可能没有人写任何testing) – 否则(很有可能)你只是等着看你是否碰巧碰到这个错误在运行时,在这种情况下,你可能不得不从你输出结果的数据库中idxmax
许多小时的工作,在IPython的墙上试图手动重现问题,最后搞清楚,这是因为idxmax
可以只报告最大行的标签 ,然后感到失望的是,没有标准function自动获取最大行的位置 ,自己写一个错误的实现,编辑代码,并祈祷你不要再次遇到问题。
你也可以试试idxmax
:
In [5]: df = pandas.DataFrame(np.random.randn(10,3),columns=['A','B','C']) In [6]: df Out[6]: ABC 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.ix[df['A'].idxmax()] Out[8]: A 2.001289 B 0.482561 C 1.579985
如果有多个行取最大值,则上述两个答案都只会返回一个索引。 如果你想要所有的行,似乎没有一个function。 但是这并不难。 以下是系列的一个例子。 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
argmax
和idmax
返回具有最大值的行的标签索引(至less使用较新版本的pandas)。 如果要使用位置索引 ,可以执行以下操作:
max_row = np.argmax(df['A'].values) df['A'].values[max_row]
numpy
是以标准的np
格式导入的。 请注意,如果您使用np.argmax(df['A'])
,则使用标签索引。