Znajdź maksymalną wartość kolumny i zwróć odpowiednie wartości wierszy za pomocą Pandas


121

Struktura danych;

Używając Python Pandas próbuję znaleźć Country& Placeo maksymalnej wartości.

Zwraca maksymalną wartość:

data.groupby(['Country','Place'])['Value'].max()

Ale jak mogę uzyskać odpowiedni Countryi Placenazwę?

Odpowiedzi:


170

Zakładając, że dfma unikalny indeks, daje to wiersz o maksymalnej wartości:

In [34]: df.loc[df['Value'].idxmax()]
Out[34]: 
Country        US
Place      Kansas
Value         894
Name: 7

Zauważ, że idxmaxzwraca etykiety indeksowe . Więc jeśli DataFrame ma duplikaty w indeksie, etykieta może nie identyfikować jednoznacznie wiersza, więc df.locmoże zwrócić więcej niż jeden wiersz.

Dlatego jeśli dfnie ma unikalnego indeksu, należy uczynić go unikalnym przed wykonaniem czynności opisanych powyżej. W zależności od ramki DataFrame czasami można użyć stacklub, set_indexaby indeks był unikalny. Możesz też po prostu zresetować indeks (aby wiersze zostały ponumerowane, zaczynając od 0):

df = df.reset_index()

Dziękuję Ci. To było dokładnie to, czego szukałem.
richie

57
df[df['Value']==df['Value'].max()]

To zwróci cały wiersz z maksymalną wartością


Objaśnienie: - Wyrażenie wewnętrzne sprawdza wartość logiczną na całej długości elementu dataFrame, a ten indeks, który spełnia wymagania po prawej stronie wyrażenia (.max ()) zwraca indeks, który z kolei wywołuje pełny wiersz tego elementu dataFrame
penta

11

Kraj i miejsce to indeks serii, jeśli nie potrzebujesz indeksu, możesz ustawić as_index=False:

df.groupby(['country','place'], as_index=False)['value'].max()

Edytować:

Wygląda na to, że chcesz mieć miejsce z maksymalną wartością dla każdego kraju, poniższy kod zrobi to, co chcesz:

df.groupby("country").apply(lambda df:df.irow(df.value.argmax()))

to zwróci tylko nazwy kolumn i dtypes
richie

9

Myślę, że najłatwiejszym sposobem zwrócenia wiersza z maksymalną wartością jest pobranie jego indeksu. argmax()można użyć do zwrócenia indeksu wiersza o największej wartości.

index = df.Value.argmax()

Teraz indeks może zostać użyty do pobrania funkcji dla tego konkretnego wiersza:

df.iloc[df.Value.argmax(), 0:2]

8

Użyj indexatrybutu DataFrame. Zwróć uwagę, że nie wpisuję wszystkich wierszy w przykładzie.

In [14]: df = data.groupby(['Country','Place'])['Value'].max()

In [15]: df.index
Out[15]: 
MultiIndex
[Spain  Manchester, UK     London    , US     Mchigan   ,        NewYork   ]

In [16]: df.index[0]
Out[16]: ('Spain', 'Manchester')

In [17]: df.index[1]
Out[17]: ('UK', 'London')

Możesz również uzyskać wartość według tego indeksu:

In [21]: for index in df.index:
    print index, df[index]
   ....:      
('Spain', 'Manchester') 512
('UK', 'London') 778
('US', 'Mchigan') 854
('US', 'NewYork') 562

Edytować

Przepraszamy za nieporozumienie, czego chcesz, spróbuj wykonać następujące czynności:

In [52]: s=data.max()

In [53]: print '%s, %s, %s' % (s['Country'], s['Place'], s['Value'])
US, NewYork, 854

poprawny. Ale szukam
jednowierszowego

Dzięki. To rozwiązałoby problem dla bieżącego zbioru danych, w którym jest tylko 1 kolumna z wartościami. Gdy jest więcej kolumn z wartościami, rozwiązanie @ unutbu działałoby lepiej. W każdym razie dzięki.
richie

5

Aby wydrukować kraj i miejsce z maksymalną wartością, użyj następującego wiersza kodu.

print(df[['Country', 'Place']][df.Value == df.Value.max()])

2

Moje rozwiązanie do znajdowania maksymalnych wartości w kolumnach:

df.ix[df.idxmax()]

, również minimum:

df.ix[df.idxmin()]

2

Polecam używanie go nlargestdla lepszej wydajności i krótszego kodu. importpandas

df[col_name].value_counts().nlargest(n=1)


2

import pandas
df to tworzona przez Ciebie ramka danych.

Użyj polecenia:

df1=df[['Country','Place']][df.Value == df['Value'].max()]

Spowoduje to wyświetlenie kraju i miejsca, których wartość jest maksymalna.


0

Napotkałem podobny błąd podczas próby importowania danych przy użyciu pand. Pierwsza kolumna w moim zestawie danych zawiera spacje przed początkiem słów. Usunąłem przestrzenie i działało jak urok!!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.