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)
此功能已更新为idxmax
Pandas 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.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
可以只报告最大行的标签,然后感到失望的是没有标准函数自动获取最大行的位置,自己编写一个错误的实现,编辑代码,并祈祷你不再遇到问题.
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)
小智 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)
小智 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
最小值。
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)
归档时间: |
|
查看次数: |
205438 次 |
最近记录: |