如何找到特定列的值最大的行?
df.max()
会给我每一列的最大值,我不知道如何得到对应的行。
最佳答案
使用 Pandas 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'].idxmax()
3
>>> df['B'].idxmax()
4
>>> df['C'].idxmax()
1
您也可以使用
numpy.argmax
,例如numpy.argmax(df['A'])
- 它提供相同的功能,并且在粗略的观察中至少与idxmax
一样快。idxmax()
返回索引标签,而不是整数。示例':如果您将字符串值作为索引标签,例如行 'a' 到 'e',您可能想知道最大值出现在第 4 行(而不是行 'd')。
如果您想要该标签在
Index
中的整数位置,您必须手动获取它(现在允许重复的行标签,这可能会很棘手)。
历史注释:
idxmax()
曾经被称为argmax()
prior to 0.11-
argmax
was deprecated prior to 1.0.0 and removed entirely in 1.0.0 - 从 Pandas 0.16 开始,
argmax
曾经存在并执行相同的功能(尽管运行速度似乎比idxmax
慢)。 argmax
函数返回整数位置 在最大元素的行位置索引内。- pandas 开始使用行标签而不是整数索引。位置整数索引过去很常见,比标签更常见,尤其是在重复行标签很常见的应用程序中。
例如,考虑这个带有重复行标签的玩具 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
会正确地提供最大值的 positional 位置行(在本例中为位置 9)。
这正是动态类型语言中那些令人讨厌的容易出错的行为之一,这使得这种事情如此不幸,值得一试。如果您正在编写系统代码并且您的系统突然被用于在加入之前未正确清理的某些数据集上,那么很容易以重复的行标签结束,尤其是像金融 Assets 的 CUSIP 或 SEDOL 标识符这样的字符串标签。您不能轻易地使用类型系统来帮助您,并且您可能无法在索引上强制执行唯一性而不遇到意外丢失的数据。
因此,您只能希望您的单元测试涵盖所有内容(他们没有,或者更可能没有人编写任何测试)- 否则(很可能)您只能等待,看看您是否碰巧在运行时遇到此错误,在这种情况下,您可能不得不从您输出结果的数据库中花费数小时的工作,在 IPython 中将头撞到墙上,试图手动重现该问题,最后弄清楚它是因为idxmax
只能报告最大行的label,然后对没有标准函数自动获取位置感到失望em> 为您准备的最大行,自己编写一个错误的实现,编辑代码,并祈祷您不会再次遇到问题。
关于python - 在 pandas DataFrame 中查找列的值最大的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10202570/