Wie finde ich alle Zeilen in einem Pandas-Datenrahmen, die count
nach der Gruppierung nach ['Sp','Mt']
Spalten den Maximalwert für die Spalte haben ?
Beispiel 1: Der folgende Datenrahmen, nach dem ich gruppiere ['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**
Erwartete Ausgabe: Ermittelt die Ergebniszeilen, deren Anzahl zwischen den Gruppen maximal ist, wie z.
0 MM1 S1 a **3**
1 3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
8 MM4 S2 uyi **7**
Beispiel 2: Dieser Datenrahmen, nach dem ich gruppiere ['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
Für das obige Beispiel möchte ich alle Zeilen erhalten, in denen count
max gleich ist, in jeder Gruppe, z.
MM2 S4 bg 10
MM4 S2 cb 8
MM4 S2 uyi 8
python
pandas
max
pandas-groupby
jojo12
quelle
quelle
1 3
?Antworten:
Um die Indizes des ursprünglichen DF zu erhalten, können Sie Folgendes tun:
Beachten Sie, dass bei mehreren Maximalwerten pro Gruppe alle zurückgegeben werden.
Aktualisieren
Auf eine Hagel-Mary-Chance, dass dies das ist, was das OP verlangt:
quelle
idx
Ansatz. Ich kann mir jedoch nur ein einziges Maximum für jede Gruppe leisten (und meine Daten haben einige doppelte Duplikate). Gibt es eine Möglichkeit, dies mit Ihrer Lösung zu umgehen?transform
Die Methode kann eine Poolleistung aufweisen, wenn der Datensatz groß genug ist. Ermitteln Sie zuerst den Maximalwert und führen Sie dann das Zusammenführen der Datenrahmen besser aus.Sie können den dataFrame nach Anzahl sortieren und dann Duplikate entfernen. Ich denke es ist einfacher:
quelle
inplace = True
als Argument fürdrop_duplicates
Eine einfache Lösung wäre die Anwendung der Funktion: idxmax (), um Zeilenindizes mit Maximalwerten abzurufen. Dies würde alle Zeilen mit dem Maximalwert in der Gruppe herausfiltern.
quelle
"I want to get ALL the rows where count equals max in each group"
, währendidxmax
Return[s] index of first occurrence of maximum over requested axis"
gemäß den Dokumenten (0.21).Nachdem ich die von Zelazny vorgeschlagene Lösung auf einem relativ großen DataFrame (~ 400.000 Zeilen) ausprobiert hatte, stellte ich fest, dass sie sehr langsam ist. Hier ist eine Alternative, die ich gefunden habe, um Größenordnungen schneller in meinem Datensatz auszuführen.
quelle
df[df['count'] == df['count_max']]
, verlieren Sie jedoch NaN-Zeilen sowie die obigen Antworten.Möglicherweise müssen Sie nicht mit
sort_values
+ gruppierendrop_duplicates
Auch fast die gleiche Logik mit
tail
quelle
Für mich wäre die einfachste Lösung, den Wert beizubehalten, wenn die Anzahl gleich dem Maximum ist. Daher reicht der folgende einzeilige Befehl aus:
quelle
Verwendung
groupby
undidxmax
Methoden:Übertragen Sie col
date
andatetime
:Holen Sie sich den Index
max
der Spaltedate
nachgroupyby ad_id
:Holen Sie sich die gewünschten Daten:
Out [54]:
quelle
quelle
Erkennen, dass "Anwenden" "am größten" auf Groupby-Objekt genauso gut funktioniert:
Zusätzlicher Vorteil - kann bei Bedarf auch Top-n-Werte abrufen:
quelle
Versuchen Sie, "nlargest" für das groupby-Objekt zu verwenden. Der Vorteil der Verwendung von nlargest besteht darin, dass der Index der Zeilen zurückgegeben wird, aus denen "die größten Elemente" abgerufen wurden. Hinweis: Wir schneiden das zweite (1) Element unseres Index auf, da unser Index in diesem Fall aus Tupeln besteht (z. B. (s1, 0)).
Geben Sie hier die Bildbeschreibung ein
quelle
Ich habe diesen Funktionsstil für viele Gruppenoperationen verwendet:
.reset_index(drop=True)
bringt Sie zurück zum ursprünglichen Index, indem Sie den Gruppenindex löschen.quelle