>>>import pandas>>>import numpy as np>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])>>> df
A B C01.232853-1.979459-0.57362610.1407670.3949401.06889020.7420231.343977-0.57974532.125299-0.649328-0.2116924-0.1872531.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 idxmaxw 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).
z powrotem od wersji Panda 0.16, argmaxkiedyś istniał i pełnił tę samą funkcję (choć wydawał się działać wolniej niż idxmax).
argmaxfunkcja 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ę DataFrameze zduplikowaną etykietą wiersza:
In[19]: dfrmOut[19]:
A B C
a 0.1436930.6538100.586007
b 0.6235820.3129030.919076
c 0.1654380.8898090.000967
d 0.3082450.7877760.571195
e 0.8700680.9356260.606911
f 0.0376020.8551930.728495
g 0.6053660.3381050.696460
h 0.0000000.0908140.963927
i 0.6883430.1884680.352213
i 0.8790000.1050390.900260In[20]: dfrm['A'].idxmax()Out[20]:'i'In[21]: dfrm.iloc[dfrm['A'].idxmax()]# .ix instead of .iloc in older versions of pandasOut[21]:
A B C
i 0.6883430.1884680.352213
i 0.8790000.1050390.900260
Zatem naiwne użycie idxmaxnie jest wystarczające, podczas gdy stara forma argmaxpoprawnie 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 idxmaxmoż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.
Oparty na przedostatnim komentarzu wygląda argmini argmaxpozostanie częścią, DataFramea różnica polega tylko na tym, czy chcesz indeks, czy etykietę. idxmaxpoda etykietę lokalizacji, w której występuje maksimum. argmaxda ci liczbę całkowitą indeksu.
ely
4
Informacje podane w celu wyjaśnienia różnicy między argmaxi idxmaxoraz w jaki sposób uniknąć błędów ze zduplikowanym indeksem były świetne! Nie zauważyłem tego, dopóki nie przeczytałem twojego komentarza w drugiej odpowiedzi. Dzięki!
tupan
W odniesieniu do zastosowania, które chcesz wdrożyć, Pandas 0.24.1 wskazuje na następujące: „zachowanie argmaxzostanie poprawione, aby przywrócić maksimum pozycji w przyszłości. Na razie użyj series.values.argmaxlub, np.argmax(np.array(values))aby uzyskać pozycję maksymalnego rzędu. ”
Sam
1
podobnie .ixzmieniono nazwę metody z drugiego przykładu na.iloc
Ma0,
jeśli twoja kolumna zawiera tylko wartości nan, spowoduje to TypeError
Max Segal
77
Możesz także spróbować idxmax:
In[5]: df = pandas.DataFrame(np.random.randn(10,3),columns=['A','B','C'])In[6]: dfOut[6]:
A B C02.0012890.4825611.5799851-0.991646-0.3878351.32023620.143826-1.0968891.4865083-0.193056-0.4990201.5365404-2.083647-3.0745910.1757725-0.186138-1.9497310.2874326-0.480790-1.771560-0.93023470.227383-0.2782532.1020048-0.0025921.434192-1.62491590.404911-2.167599-0.452900In[7]: df.idxmax()Out[7]:
A 0
B 8
C 7
na przykład
In[8]: df.loc[df['A'].idxmax()]Out[8]:
A 2.001289
B 0.482561
C 1.579985
df.ix[df['A'].idxmax()].valuesaby złapać tablicę, którą chciałem. nadal działa.
Yojimbo,
2
Pamiętaj, że musisz zachować ostrożność, próbując wykorzystać dane wyjściowe idxmaxjako podajnik do ixlub locjako środek do podzielenia danych na części i / lub uzyskania położenia pozycyjnego maksymalnego wiersza. Ponieważ możesz mieć duplikaty w Index- patrz aktualizacja mojej odpowiedzi na przykład.
ely
25
Obie powyższe odpowiedzi zwrócą tylko jeden indeks, jeśli istnieje wiele wierszy, które przyjmują maksymalną wartość. Jeśli chcesz wszystkie wiersze, nie ma funkcji. Ale nie jest to trudne. Poniżej znajduje się przykład dla Series; to samo można zrobić dla DataFrame:
In[1]:from pandas importSeries,DataFrameIn[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
>>>import pandas>>>import numpy as np>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])>>> df
A B C01.232853-1.979459-0.57362610.1407670.3949401.06889020.7420231.343977-0.57974532.125299-0.649328-0.2116924-0.1872531.908618-1.862934>>> df['A'].argmax()3>>> df['B'].argmax()4>>> df['C'].argmax()1
zwraca następujący komunikat:
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.
Funkcja idmaxDataFrame zwraca indeks etykiety wiersza z maksymalną wartością, a zachowanie argmaxzależy od wersji pandas(w tej chwili zwraca ostrzeżenie). Jeśli chcesz użyć indeksu pozycyjnego , możesz wykonać następujące czynności:
max_row = df['A'].values.argmax()
lub
import numpy as np
max_row = np.argmax(df['A'].values)
Pamiętaj, że jeśli używasz np.argmax(df['A'])zachowuje się tak samo jak df['A'].argmax().
sort_values
i uzyskać indeks:df.sort_values('col', ascending=False)[:2].index
Odpowiedzi:
Użyj
idxmax
funkcji pandy . To proste:Alternatywnie możesz również użyć
numpy.argmax
, na przykładnumpy.argmax(df['A'])
- zapewnia to samo i pojawia się co najmniej tak szybko, jakidxmax
w pobieżnych obserwacjach.idxmax()
zwraca etykiety indeksów, a nie liczby całkowite.Index
, musisz uzyskać ją ręcznie (co może być trudne, ponieważ dozwolone są duplikaty etykiet wierszy).UWAGI HISTORYCZNE:
idxmax()
był wywoływanyargmax()
przed 0.11argmax
był przestarzały przed wersją 1.0.0 i całkowicie usunięty w wersji 1.0.0argmax
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.Na przykład rozważ tę zabawkę
DataFrame
ze zduplikowaną etykietą wiersza:Zatem naiwne użycie
idxmax
nie jest wystarczające, podczas gdy stara formaargmax
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.źródło
argmin
iargmax
pozostanie częścią,DataFrame
a różnica polega tylko na tym, czy chcesz indeks, czy etykietę.idxmax
poda etykietę lokalizacji, w której występuje maksimum.argmax
da ci liczbę całkowitą indeksu.argmax
iidxmax
oraz w jaki sposób uniknąć błędów ze zduplikowanym indeksem były świetne! Nie zauważyłem tego, dopóki nie przeczytałem twojego komentarza w drugiej odpowiedzi. Dzięki!argmax
zostanie poprawione, aby przywrócić maksimum pozycji w przyszłości. Na razie użyjseries.values.argmax
lub,np.argmax(np.array(values))
aby uzyskać pozycję maksymalnego rzędu. ”.ix
zmieniono nazwę metody z drugiego przykładu na.iloc
Możesz także spróbować
idxmax
:na przykład
źródło
df.ix[df['A'].idxmax()].values
aby złapać tablicę, którą chciałem. nadal działa.idxmax
jako podajnik doix
lubloc
jako środek do podzielenia danych na części i / lub uzyskania położenia pozycyjnego maksymalnego wiersza. Ponieważ możesz mieć duplikaty wIndex
- patrz aktualizacja mojej odpowiedzi na przykład.Obie powyższe odpowiedzi zwrócą tylko jeden indeks, jeśli istnieje wiele wierszy, które przyjmują maksymalną wartość. Jeśli chcesz wszystkie wiersze, nie ma funkcji. Ale nie jest to trudne. Poniżej znajduje się przykład dla Series; to samo można zrobić dla DataFrame:
źródło
df[df['A'] == df['A'].max()]
argmax()
podałby indeks odpowiadający maksymalnej wartości dla kolumnyX.iloc
można użyć, aby uzyskać wiersz DataFrame df dla tego indeksu.źródło
Bezpośrednie rozwiązanie „.argmax ()” nie działa dla mnie.
Poprzedni przykład podany przez @ely
zwraca następujący komunikat:
Tak więc moim rozwiązaniem jest:
źródło
Ten jeden wiersz kodu pokaże ci, jak znaleźć maksymalną wartość z wiersza w ramce danych, tutaj
mx
jest ramka danych iiloc[0]
wskazuje zerowy indeks.źródło
Funkcja
idmax
DataFrame zwraca indeks etykiety wiersza z maksymalną wartością, a zachowanieargmax
zależy od wersjipandas
(w tej chwili zwraca ostrzeżenie). Jeśli chcesz użyć indeksu pozycyjnego , możesz wykonać następujące czynności:lub
Pamiętaj, że jeśli używasz
np.argmax(df['A'])
zachowuje się tak samo jakdf['A'].argmax()
.źródło