特定の列の値が最大になる行を見つけるにはどうすればよいですか?
df.max()
各列の最大値が表示されますが、対応する行を取得する方法がわかりません。
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()
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
は不十分ですが、の古い形式では、最大行の位置(この場合は位置9)argmax
が正しく提供されます。
これは、動的に型付けされた言語での厄介な種類のバグが発生しやすい動作の1つであり、この種のことを非常に不幸にし、死んだ馬を打ち負かす価値があります。システムコードを記述していて、結合する前に適切にクリーンアップされていない一部のデータセットでシステムが突然使用された場合、行ラベル、特に金融資産のCUSIPやSEDOL識別子などの文字列ラベルが重複する可能性が非常に高くなります。型システムを簡単に使用して支援することはできません。また、予期せず欠落したデータに遭遇することなく、インデックスに一意性を適用できない場合があります。
したがって、ユニットテストがすべてをカバーしていることを期待する必要があります(テストを作成しなかったか、おそらく誰もテストを作成しなかった可能性があります)。実行時のエラー。この場合、結果を出力するデータベースから何時間もの作業をドロップする必要があります。IPythonで壁に頭をぶつけて手動で問題を再現しようとすると、最終的にはそれidxmax
ができるのは最大行のラベルを報告すると、標準関数が自動的に最大行の位置を取得しないことに失望し、バグのある実装を自分で作成し、コードを編集して、問題が再発しないように祈っています。
あなたも試してみてください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
上記の両方の回答は、最大値をとる行が複数ある場合に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.iloc[df['columnX'].argmax()]
argmax()
columnXの最大値に対応するインデックスを提供します。iloc
このインデックスのDataFramedfの行を取得するために使用できます。
非常に単純です。以下のように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
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を返します。これは、一部のユースケースで便利です。
直接の「.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()
だけでなく行全体が必要な場合は、必要な「上位」行の数id
を使用df.nlargest
して渡すことができます。また、必要な列を渡すこともできます。
df.nlargest(2,['A'])
の上位2つの値に対応する行が表示されますA
。
df.nsmallest
最小値に使用します。
mx.iloc[0].idxmax()
この1行のコードは、データフレームの行から最大値を見つける方法を示します。mx
これがデータフレームでありiloc[0]
、0番目のインデックスを示します。
idmax
DataFrameのは、最大値を持つ行のラベルインデックスを返し、の動作はのバージョン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()
。
このデータフレームを検討する
[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
使用する:
data.iloc[data['A'].idxmax()]
data['A'].idxmax()
-行の観点から最大値の場所を検索し
data.iloc(
ます)-行を返します
最大値に同点がある場合は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