Jak znaleźć wszystkie wiersze w ramce danych pandy, które mają maksymalną wartość dla count
kolumny, po zgrupowaniu według ['Sp','Mt']
kolumn?
Przykład 1: następujące ramki danych, które grupuję według ['Sp','Mt']
:
Sp Mt Value count
0 MM1 S1 a **3**
1 MM1 S1 n 2
2 MM1 S3 cb 5
3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi **7**
Oczekiwany wynik: uzyskaj wiersze wyników, których liczba jest maksymalna między grupami, na przykład:
0 MM1 S1 a **3**
1 3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
8 MM4 S2 uyi **7**
Przykład 2: ta ramka danych, którą grupuję według ['Sp','Mt']
:
Sp Mt Value count
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 8
8 MM4 S2 uyi 8
W powyższym przykładzie chcę uzyskać wszystkie wiersze o wartości count
równej maksimum w każdej grupie, np .:
MM2 S4 bg 10
MM4 S2 cb 8
MM4 S2 uyi 8
python
pandas
max
pandas-groupby
jojo12
źródło
źródło
1 3
?Odpowiedzi:
Aby uzyskać indeksy oryginalnego DF, możesz:
Pamiętaj, że jeśli masz wiele maksymalnych wartości na grupę, wszystkie zostaną zwrócone.
Aktualizacja
Z okazji gradobicia, że właśnie tego wymaga PO:
źródło
idx
podejścia. Ale mogę sobie pozwolić tylko na jedno maksimum dla każdej grupy (a moje dane mają kilka duplikatów). czy jest sposób na obejście tego z rozwiązaniem?transform
metoda może mieć wydajność puli, gdy zestaw danych jest wystarczająco duży, najpierw uzyskaj maksymalną wartość, a następnie scal ramki danych.Możesz posortować dataFrame według liczby, a następnie usunąć duplikaty. Myślę, że to łatwiejsze:
źródło
inplace = True
jako argumentu dodrop_duplicates
Łatwym rozwiązaniem byłoby zastosowanie: funkcja idxmax (), aby uzyskać indeksy wierszy o maksymalnych wartościach. Spowoduje to odfiltrowanie wszystkich wierszy o maksymalnej wartości w grupie.
źródło
"I want to get ALL the rows where count equals max in each group"
, a jednocześnieidxmax
Return[s] index of first occurrence of maximum over requested axis"
zgodnie z dokumentami (0.21).Po wypróbowaniu rozwiązania zaproponowanego przez Zelazny na stosunkowo dużej ramce danych (~ 400 tys. Wierszy) stwierdziłem, że działa bardzo wolno. Oto alternatywa, którą znalazłem, aby szybciej uruchamiać rzędy wielkości w moim zestawie danych.
źródło
df[df['count'] == df['count_max']]
spowoduje utratę wierszy NaN, a także powyższych odpowiedzi.Może nie być konieczne korzystanie z grupy za pomocą
sort_values
+drop_duplicates
Również prawie taka sama logika przy użyciu
tail
źródło
Dla mnie najłatwiejszym rozwiązaniem byłoby zachowanie wartości, gdy liczba jest równa maksimum. Dlatego wystarczy jedno polecenie w jednym wierszu:
źródło
Zastosowanie
groupby
iidxmax
metody:przenieś col
date
dodatetime
:pobierz indeks
max
kolumnydate
pogroupyby ad_id
:uzyskaj potrzebne dane:
Out [54]:
źródło
źródło
Zrozumienie, że „zastosowanie” „największego” obiektu do grupowania działa równie dobrze:
Dodatkowa zaleta - w razie potrzeby można również pobrać najwyższe wartości n :
źródło
Spróbuj użyć „największego” obiektu grupy. Zaletą użycia nlargest jest to, że zwraca indeks wierszy, z których pobrano „najlżejsze elementy”. Uwaga: przecinamy drugi (1) element naszego indeksu, ponieważ nasz indeks w tym przypadku składa się z krotek (np. (S1, 0)).
wprowadź opis zdjęcia tutaj
źródło
Używam tego funkcjonalnego stylu do wielu operacji grupowych:
.reset_index(drop=True)
przywraca pierwotny indeks, upuszczając indeks grupy.źródło