Python 查找数据帧中列值最大的行

Python 查找数据帧中列值最大的行,python,pandas,dataframe,row,argmax,Python,Pandas,Dataframe,Row,Argmax,如何查找特定列的值为最大的行 df.max()。这很简单: >>> 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

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

df.max()。这很简单:

>>> 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
  • 或者,您也可以使用
    numpy.argmax
    ,例如
    numpy.argmax(df['A'])
    ——它提供了相同的功能,并且在粗略观察中至少与
    idxmax
    一样快

  • idxmax()
    返回索引标签,而不是整数。

    • 示例”:如果索引标签为字符串值,如“a”到“e”行,则可能希望知道最大值出现在第4行(而不是“d”行)
    • 如果您想在
      索引中获取该标签的整数位置,则必须手动获取该位置(由于允许重复行标签,这可能会很棘手)

历史注释:

  • idxmax()
    用于调用
  • 从0.16开始,
    argmax
    曾经存在并执行相同的功能(尽管运行速度似乎比
    idxmax
    慢)。
    • argmax
      函数返回最大元素行位置索引中的整数位置
    • 熊猫移动到使用行标签而不是整数索引。位置整数索引过去非常常见,比标签更常见,尤其是在重复行标签常见的应用程序中
例如,考虑这个玩具<代码>数据框< /C> >重复行标签:

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
的旧形式将正确地提供max行的位置(在本例中,位置9)

这正是动态类型语言中那些讨厌的、容易出现bug的行为之一,这使得这类事情非常不幸,值得一试。如果您正在编写系统代码,并且您的系统突然在某些数据集上被使用,而这些数据集在加入之前没有被正确清理,那么很容易产生重复的行标签,特别是字符串标签,如金融资产的CUSIP或SEDOL标识符。您无法轻松地使用类型系统来帮助您,并且您可能无法在索引上强制唯一性,而不会遇到意外丢失的数据

因此,你只能希望你的单元测试涵盖了所有内容(它们没有,或者更可能没有人编写任何测试)——否则(很可能)你只能等待看你是否在运行时碰巧遇到这个错误,在这种情况下,你可能不得不从你正在向其输出结果的数据库中放弃很多小时的工作,在IPython中,你的头撞在墙上试图手动重现问题,最终发现这是因为
idxmax
只能报告最大行的标签,然后失望地发现没有标准函数自动为你获取最大行的位置,自己编写了一个错误实现,编辑代码,并祈祷不要再次遇到问题。

使用pandas函数。这很简单:

>>> 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
  • 或者,您也可以使用
    numpy.argmax
    ,例如
    numpy.argmax(df['A'])
    ——它提供了相同的功能,并且在粗略观察中至少与
    idxmax
    一样快

  • idxmax()
    返回索引标签,而不是整数。

    • 示例”:如果索引标签为字符串值,如“a”到“e”行,则可能希望知道最大值出现在第4行(而不是“d”行)
    • 如果您想在
      索引中获取该标签的整数位置,则必须手动获取该位置(由于允许重复行标签,这可能会很棘手)

历史注释:

  • idxmax()
    用于调用
  • 从0.16开始,
    argmax
    曾经存在并执行相同的功能(尽管运行速度似乎比
    idxmax
    慢)。
    • argmax
      函数返回最大元素行位置索引中的整数位置
    • 熊猫移动到使用行标签而不是整数索引。位置整数索引过去非常常见,比标签更常见,尤其是在重复行标签常见的应用程序中
例如,考虑这个玩具<代码>数据框< /C> >重复行标签:

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
的旧形式将正确地提供max行的位置(在本例中,位置9)

这正是动态类型语言中那些讨厌的、容易出现bug的行为之一,这使得这类事情非常不幸,值得一试。如果您正在编写系统代码,并且您的系统突然在某些数据集上被使用,而这些数据集在加入之前没有被正确清理,那么很容易产生重复的行标签,特别是字符串标签,如金融资产的CUSIP或SEDOL标识符。您无法轻松地使用类型系统来帮助您,并且您可能无法在索引上强制唯一性,而不会遇到意外丢失的数据

因此,你只能希望你的单元测试涵盖了所有内容(它们没有,或者更可能没有人编写任何测试)——否则(很可能)你只能等待看你是否在运行时碰巧遇到这个错误,在这种情况下,你可能不得不从你正在向其输出结果的数据库中放弃很多小时的工作,在IPython把你的头撞在墙上
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
max_row = df['A'].values.argmax()
import numpy as np
max_row = np.argmax(df['A'].values)
df.iloc[df['columnX'].argmax()]
mx.iloc[0].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
FutureWarning: 'argmax' is deprecated, use 'idxmax' instead. The behavior of 'argmax' 
will be corrected to return the positional maximum in the future.
Use 'series.values.argmax' to get the position of the maximum now.
df['A'].values.argmax()
A  B  C
x  1  4
y  2  10
z  5  9
df.loc[df['C'] == df['C'].max()]   # condition check
A B C
y 2 10
df.nlargest(2,['A'])
[In]: df = pd.DataFrame(np.random.randn(4,3),columns=['A','B','C'])
[Out]:
          A         B         C
0 -0.253233  0.226313  1.223688
1  0.472606  1.017674  1.520032
2  1.454875  1.066637  0.381890
3 -0.054181  0.234305 -0.557915
[In]: df[df['C']==df['C'].max()])
[Out]:
          A         B         C
1  0.472606  1.017674  1.520032