Użyj idxmax
funkcji pandy . To proste:
>>> 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
Alternatywnie możesz również użyć numpy.argmax
, na przykład numpy.argmax(df['A'])
- zapewnia to samo i pojawia się co najmniej tak szybko, jak idxmax
w pobieżnych obserwacjach.
idxmax()
zwraca etykiety indeksów, a nie liczby całkowite.
- Przykład: jeśli masz wartości ciągu jako etykiety indeksu, takie jak wiersze od „a” do „e”, możesz chcieć wiedzieć, że maksimum występuje w wierszu 4 (nie w wierszu „d”).
- jeśli chcesz, aby liczba całkowita tej etykiety była wewnątrz
Index
, musisz uzyskać ją ręcznie (co może być trudne, ponieważ dozwolone są duplikaty etykiet wierszy).
UWAGI HISTORYCZNE:
idxmax()
był wywoływany argmax()
przed 0.11
argmax
był przestarzały przed wersją 1.0.0 i całkowicie usunięty w wersji 1.0.0
- z powrotem od wersji Panda 0.16,
argmax
kiedyś istniał i pełnił tę samą funkcję (choć wydawał się działać wolniej niż idxmax
).
argmax
funkcja zwróciła pozycję całkowitą w indeksie położenia wiersza maksymalnego elementu.
- pandy przeniesiono do używania etykiet wierszy zamiast indeksów całkowitych. Wskaźniki liczb całkowitych pozycyjnych były kiedyś bardzo powszechne, częściej niż etykiety, szczególnie w aplikacjach, w których zduplikowane etykiety wierszy są wspólne.
Na przykład rozważ tę zabawkę DataFrame
ze zduplikowaną etykietą wiersza:
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
Zatem naiwne użycie idxmax
nie jest wystarczające, podczas gdy stara forma argmax
poprawnie zapewniałaby położenie pozycyjne rzędu maksymalnego (w tym przypadku pozycja 9).
Jest to dokładnie jedno z tych paskudnych rodzajów podatnych na błędy zachowań w dynamicznie pisanych językach, które sprawiają, że takie rzeczy są tak niefortunne i warte pokonania martwego konia. Jeśli piszesz kod systemu, a Twój system nagle przyzwyczaja się do niektórych zestawów danych, które nie są odpowiednio czyszczone przed dołączeniem, bardzo łatwo jest uzyskać zduplikowane etykiety wierszy, zwłaszcza etykiety ciągów, takie jak identyfikator CUSIP lub SEDOL dla aktywów finansowych. Nie możesz łatwo użyć systemu typów, aby ci pomóc, i możesz nie być w stanie wymusić wyjątkowości indeksu bez napotkania nieoczekiwanie brakujących danych.
Pozostaje ci więc nadzieja, że twoje testy jednostkowe obejmują wszystko (one nie, lub bardziej prawdopodobne, że nikt nie napisał żadnych testów) - w przeciwnym razie (najprawdopodobniej) po prostu czekasz, czy zdarzy ci się w to uderzyć błąd w czasie wykonywania, w którym to przypadku prawdopodobnie musisz rzucić wiele godzin pracy z bazy danych, do której wypisywałeś wyniki, uderz głową o ścianę w IPython, próbując ręcznie odtworzyć problem, w końcu stwierdzając, że to dlatego, że idxmax
można tylko zgłoś etykietę maksymalnego wiersza, a następnie rozczarowany, że żadna standardowa funkcja nie pobiera automatycznie pozycji maksymalnego wiersza, samodzielnie pisząc błędną implementację, edytując kod i modląc się, abyś nie napotkał ponownie problemu.