特定の列の値が最大である行を見つけるにはどうすればよいですか?
df.max()
各列の最大値を取得しますが、対応する行を取得する方法がわかりません。
sort_values
し、インデックスを取得:df.sort_values('col', ascending=False)[:2].index
特定の列の値が最大である行を見つけるにはどうすればよいですか?
df.max()
各列の最大値を取得しますが、対応する行を取得する方法がわかりません。
sort_values
し、インデックスを取得:df.sort_values('col', ascending=False)[:2].index
回答:
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.argmax
、numpy.argmax(df['A'])
-を使用することもできます-これは同じものを提供し、少なくともidxmax
おおまかな観察と同じくらい高速に表示されます。
idxmax()
整数ではなく、インデックスラベルを返します。
Index
必要な場合は、手動で取得する必要があります(重複する行ラベルが許可されているため、これは難しい場合があります)。歴史的ノート:
idxmax()
以前は0.11より前に呼び出されていargmax()
ましたargmax
1.0.0より前に廃止され、1.0.0で完全に削除されました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
できるだけ最大行のラベルを報告し、標準関数が最大行の位置を自動的に取得しないことに失望し、バグのある実装を自分で記述し、コードを編集して、問題が再び発生しないように祈ります。
argmin
とargmax
の一部残るDataFrame
との違いは、インデックスまたはラベルをしたいだけかどうかです。idxmax
最大値が発生する場所のラベルが表示されます。argmax
インデックスの整数自体を取得します。
argmax
とidxmax
どのように複製されたインデックスでのバグを回避する、とは素晴らしかったです!他の答えであなたのコメントを読むまで、私はそれに気づきませんでした。ありがとう!
argmax
ています。今のところ、series.values.argmax
またはnp.argmax(np.array(values))
を使用して最大行の位置を取得します。
.ix
2番目の例のメソッドの名前は.iloc
あなたも試すかもしれません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
df.ix[df['A'].idxmax()].values
私が欲しかった配列をつかむために。まだ動作します。
idxmax
フィーダーとして使用しix
たりloc
、データをサブスライスしたり、最大行の位置を取得したりする手段として使用する場合は注意が必要です。重複している可能性があるIndex
ため、例については私の回答の更新を参照してください。
上記の両方の答えは、最大値を取る行が複数ある場合に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
df[df['A'] == df['A'].max()]
df.iloc[df['columnX'].argmax()]
argmax()
columnXの最大値に対応するインデックスを提供します。iloc
このインデックスのDataFrame dfの行を取得するために使用できます。
直接的な「.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()