pandas DataFrameで列の値が最大になる行を見つける


208

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

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


上位2つの値を取得することは可能ですか?マックスだけではなく?
AsheKetchum 2017年

5
あなたは使用することができますsort_valuesし、インデックスを取得:df.sort_values('col', ascending=False)[:2].index
lazy1

2
lazy1:max / idxmaxの検索はO(N)のみであるのに対し、シリーズ全体を不必要に並べ替えないでください。これは、平均でO(N logN)だからです。
smci

回答:


240

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'].argmax()
3
>>> df['B'].argmax()
4
>>> df['C'].argmax()
1
  • あるいはnumpy.argmaxnumpy.argmax(df['A'])-を使用することもできます-これは同じものを提供し、少なくともidxmaxおおまかな観察と同じくらい高速に表示されます。

  • idxmax() 整数ではなく、インデックスラベルを返します。

    • 例 ':行' a 'から' e 'のように、インデックスラベルとして文字列値がある場合、最大値が行4(行' d 'ではない)で発生することを知りたい場合があります。
    • 内のそのラベルの整数位置がIndex必要な場合は、手動で取得する必要があります(重複する行ラベルが許可されているため、これは難しい場合があります)。

歴史的ノート:

  • idxmax()以前は0.11より前に呼び出されていargmax()ました
  • argmax 1.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古い形式のに対し、十分ではないargmaxであろうが正しく提供する位置(この場合、位置9)最大行の位置を。

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

したがって、ユニットテストがすべてをカバーしたことを期待して(彼らはテストを作成しなかった、またはおそらく誰もテストを作成しなかった)-それ以外の場合(ほとんどの場合)は、たまたまこれにぶつかったかどうかを確認するために待っているだけです。あなたは、おそらくあなたは、手動で問題を再現しようとIPythonで壁に頭を強打して結果を出力して、データベースからの仕事の多くの時間の価値を落とす行かなければならない。その場合には、実行時にエラーが、最終的にそれはだということを考え出すためにidxmaxできるだけ最大行のラベルを報告し、標準関数が最大行の位置を自動的に取得しないことに失望し、バグのある実装を自分で記述し、コードを編集して、問題が再び発生しないように祈ります。


13
そこに最後から2番目のコメントに基づいて、それはのように見えるargminargmaxの一部残るDataFrameとの違いは、インデックスまたはラベルをしたいだけかどうかです。idxmax最大値が発生する場所のラベルが表示されます。argmaxインデックスの整数自体を取得します。
2013

4
違いを説明するために提供された情報argmaxidxmaxどのように複製されたインデックスでのバグを回避する、とは素晴らしかったです!他の答えであなたのコメントを読むまで、私はそれに気づきませんでした。ありがとう!
tupan 2016年

実装したい使用に関して、Pandas 0.24.1は次のことを示しargmaxています。今のところ、series.values.argmaxまたはnp.argmax(np.array(values))を使用して最大行の位置を取得します。
サム

1
同様に、.ix2番目の例のメソッドの名前は.iloc
Ma0

列にnan値のみが含まれる場合、TypeError
Max Segal

77

あなたも試すかもしれません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

ウェスありがとう。idxmaxに関するドキュメント()ここで:pandas.pydata.org/pandas-docs/dev/generated/...
ウィル

df.ix[df['A'].idxmax()].values私が欲しかった配列をつかむために。まだ動作します。
Yojimbo 2015

2
の出力をidxmaxフィーダーとして使用しixたりloc、データをサブスライスしたり、最大行の位置を取得したりする手段として使用する場合は注意が必要です。重複している可能性があるIndexため、例については私の回答の更新を参照してください。
2015年

25

上記の両方の答えは、最大値を取る行が複数ある場合に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

10
ありがとう!DataFrameのバージョン:df[df['A'] == df['A'].max()]
Dennis Golomazov 2016年

これは実際に正しい答えです(DataFrameバージョン)。
断続的

12
df.iloc[df['columnX'].argmax()]

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


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

2
mx.iloc[0].idxmax()

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


1

idmaxデータフレームの最大値との動作と行のラベルのインデックスを返す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()です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.