Gunakan idxmax
fungsi panda . Sangat mudah:
>>> 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
Atau Anda juga bisa menggunakan numpy.argmax
, seperti numpy.argmax(df['A'])
- ia menyediakan hal yang sama, dan muncul setidaknya secepatidxmax
dalam pengamatan sepintas.
idxmax()
mengembalikan label indeks, bukan bilangan bulat.
- Contoh ': jika Anda memiliki nilai string sebagai label indeks Anda, seperti baris' a 'hingga' e ', Anda mungkin ingin tahu bahwa max muncul di baris 4 (bukan baris' d ').
- jika Anda ingin posisi integer dari label di dalam
Index
Anda harus mendapatkannya secara manual (yang bisa rumit sekarang karena label baris duplikat diperbolehkan).
CATATAN SEJARAH:
idxmax()
dulu dipanggil argmax()
sebelum 0,11
argmax
dihentikan sebelum 1.0.0 dan dihapus seluruhnya pada 1.0.0
- kembali pada Pandas 0.16,
argmax
dulu ada dan melakukan fungsi yang sama (meskipun tampaknya berjalan lebih lambat dari idxmax
).
argmax
fungsi mengembalikan posisi integer dalam indeks lokasi baris elemen maksimum.
- panda dipindahkan menggunakan label baris alih-alih indeks integer. Indeks integer posisi dulu sangat umum, lebih umum daripada label, terutama dalam aplikasi di mana label baris duplikat umum.
Misalnya, pertimbangkan mainan ini DataFrame
dengan label baris duplikat:
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
Jadi di sini penggunaan naif idxmax
tidak cukup, sedangkan bentuk lama argmax
akan dengan benar memberikan lokasi posisi baris maks (dalam hal ini, posisi 9).
Ini persis salah satu dari jenis perilaku rawan bug dalam bahasa yang diketik secara dinamis yang membuat hal semacam ini sangat disayangkan, dan layak mengalahkan kuda mati. Jika Anda menulis kode sistem dan sistem Anda tiba-tiba digunakan pada beberapa set data yang tidak dibersihkan dengan benar sebelum bergabung, sangat mudah untuk berakhir dengan label baris duplikat, terutama label string seperti pengidentifikasi CUSIP atau SEDOL untuk aset keuangan. Anda tidak dapat dengan mudah menggunakan sistem tipe untuk membantu Anda, dan Anda mungkin tidak dapat menegakkan keunikan pada indeks tanpa mengalami data yang hilang secara tak terduga.
Jadi Anda pergi dengan harapan bahwa unit test Anda mencakup semuanya (tidak, atau lebih mungkin tidak ada yang menulis tes) - jika tidak (kemungkinan besar) Anda hanya menunggu untuk melihat apakah Anda kebetulan menabrak ini kesalahan saat runtime, dalam hal ini Anda mungkin harus bekerja berjam-jam dari database yang Anda hasilkan hasilnya, membenturkan kepala Anda ke dinding di IPython mencoba mereproduksi masalah secara manual, akhirnya mencari tahu bahwa itu karena hanyaidxmax
bisa laporkan label baris maks, dan kemudian kecewa karena tidak ada fungsi standar yang secara otomatis mendapatkan posisi baris max untuk Anda, menulis sendiri implementasi kereta, mengedit kode, dan berdoa Anda tidak mengalami masalah lagi.