286

特定の列の値が最大になる行を見つけるにはどうすればよいですか?

df.max()各列の最大値が表示されますが、対応する行を取得する方法がわかりません。

4

13 に答える 13

314

pandasidxmax関数を使用します。それは簡単です:

>>> 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()0.11より前に呼び出されていましたargmax()
  • argmax1.0.0より前に非推奨になり、1.0.0で完全に削除されました
  • Pandas 0.16の時点で、argmax以前は存在し、同じ機能を実行していました(ただし、実行速度はより遅いように見えましたidxmax)。
  • 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

したがって、ここでは、の単純な使用でidxmaxは不十分ですが、の古い形式では、最大行の位置(この場合は位置9)argmaxが正しく提供されます。

これは、動的に型付けされた言語での厄介な種類のバグが発生しやすい動作の1つであり、この種のことを非常に不幸にし、死んだ馬を打ち負かす価値があります。システムコードを記述していて、結合する前に適切にクリーンアップされていない一部のデータセットでシステムが突然使用された場合、行ラベル、特に金融資産のCUSIPやSEDOL識別子などの文字列ラベルが重複する可能性が非常に高くなります。型システムを簡単に使用して支援することはできません。また、予期せず欠落したデータに遭遇することなく、インデックスに一意性を適用できない場合があります。

したがって、ユニットテストがすべてをカバーしていることを期待する必要があります(テストを作成しなかったか、おそらく誰もテストを作成しなかった可能性があります)。実行時のエラー。この場合、結果を出力するデータベースから何時間もの作業をドロップする必要があります。IPythonで壁に頭をぶつけて手動で問題を再現しようとすると、最終的にはそれidxmaxができるのは最大行のラベルを報告すると、標準関数が自動的に最大行の位置を取得しないことに失望し、バグのある実装を自分で作成し、コードを編集して、問題が再発しないように祈っています。

于 2012-04-18T04:31:30.417 に答える
92

あなたも試してみてください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
于 2012-04-18T15:51:32.550 に答える
31

上記の両方の回答は、最大値をとる行が複数ある場合に1つのインデックスのみを返します。すべての行が必要な場合は、機能がないようです。しかし、それは難しいことではありません。以下はシリーズの例です。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
于 2014-09-10T20:55:04.853 に答える
21
df.iloc[df['columnX'].argmax()]

argmax()columnXの最大値に対応するインデックスを提供します。ilocこのインデックスのDataFramedfの行を取得するために使用できます。

于 2018-03-08T09:00:49.140 に答える
7

非常に単純です。以下のようにdfがあり、Cで最大値の行を出力します。

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
于 2020-08-11T03:30:42.893 に答える
7

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()')

また、Seriesの代わりにDataFrameを返します。これは、一部のユースケースで便利です。

于 2021-02-01T11:20:25.517 に答える
4

直接の「.argmax()」ソリューションは私には機能しません。

@elyによって提供された前の例

>>> 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()
于 2019-03-20T14:17:39.297 に答える
3

だけでなく行全体が必要な場合は、必要な「上位」行の数idを使用df.nlargestして渡すことができます。また、必要な列を渡すこともできます。

df.nlargest(2,['A'])

の上位2つの値に対応する行が表示されますA

df.nsmallest最小値に使用します。

于 2020-11-26T14:48:56.900 に答える
2
mx.iloc[0].idxmax()

この1行のコードは、データフレームの行から最大値を見つける方法を示します。mxこれがデータフレームでありiloc[0]、0番目のインデックスを示します。

于 2019-01-29T04:38:57.083 に答える
1

idmaxDataFrameのは、最大値を持つ行のラベルインデックスを返し、の動作はのバージョンargmaxによって異なりpandasます(現在は警告を返します)。位置インデックスを使用する場合は、次のように実行できます。

max_row = df['A'].values.argmax()

また

import numpy as np
max_row = np.argmax(df['A'].values)

np.argmax(df['A'])を使用する場合は、と同じように動作することに注意してくださいdf['A'].argmax()

于 2017-07-05T19:00:44.137 に答える
1

このデータフレームを検討する

[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

列「C」が最大である行を知りたいと仮定すると、以下が作業を行います

[In]: df[df['C']==df['C'].max()])
[Out]:
          A         B         C
1  0.472606  1.017674  1.520032
于 2021-05-20T11:58:15.183 に答える
0

使用する:

data.iloc[data['A'].idxmax()]

data['A'].idxmax()-行の観点から最大値の場所を検索し data.iloc(ます)-行を返します

于 2022-01-29T05:11:26.593 に答える
0

最大値に同点がある場合はidxmax、最初の最大値のみのインデックスを返します。たとえば、次のDataFrameでは次のようになります。

   A  B  C
0  1  0  1
1  0  0  1
2  0  0  0
3  0  1  1
4  1  0  0

idxmax戻り値

A    0
B    3
C    0
dtype: int64

ここで、最大値に対応するすべてのインデックスが必要な場合は、max+eqを使用してブールDataFrameを作成し、それを使用しdf.indexてインデックスを除外できます。

out = df.eq(df.max()).apply(lambda x: df.index[x].tolist())

出力:

A       [0, 4]
B          [3]
C    [0, 1, 3]
dtype: object
于 2022-02-10T00:24:21.813 に答える