特定の列の値が最大となる行を見つけるにはどうすればよいでしょうか?
df.max()
各列の最大値は得られますが、対応する行を取得する方法がわかりません。
ベストアンサー1
パンダを使う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'].idxmax()
3
>>> df['B'].idxmax()
4
>>> df['C'].idxmax()
1
numpy.argmax
代わりに、 などを使用することもできますnumpy.argmax(df['A'])
。これは同じことを提供し、少なくともidxmax
表面的な観察と同じ速さで表示されます。idxmax()
整数ではなくインデックス ラベルを返します。例: 行 'a' から 'e' のように、インデックス ラベルとして文字列値がある場合、最大値が行 4 (行 'd' ではない) にあることを確認する必要があります。
ラベル内の整数位置が必要な場合は、
Index
手動で取得する必要があります (重複する行ラベルが許可されているため、これは難しい場合があります)。
歴史的注記:
idxmax()
かつてはargmax()
0.11以前argmax
1.0.0 より前では非推奨となり、1.0.0 で完全に削除されました。- Pandas 0.16 の時点では
argmax
が存在し、同じ機能を実行していました (ただし、 よりも実行速度が遅いようですidxmax
)。 argmax
関数は、最大要素の行位置のインデックス内の整数位置を返します。- pandas は、整数インデックスの代わりに行ラベルを使用するようになりました。位置整数インデックスは、特に行ラベルの重複がよくあるアプリケーションでは、ラベルよりも非常に一般的でした。
たとえば、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
できないことが原因であるとわかり、最大行の位置を自動的に取得する標準関数がないことにはがっかりし、バグのある実装を自分で記述し、コードを編集し、問題に再び遭遇しないことを祈ることになります。