Ich habe einen Datenrahmen mit Wiederholungswerten in Spalte A. Ich möchte Duplikate löschen und die Zeile mit dem höchsten Wert in Spalte B beibehalten.
Also das:
A B
1 10
1 20
2 30
2 40
3 10
Sollte sich in Folgendes verwandeln:
A B
1 20
2 40
3 10
Wes hat einige nette Funktionen hinzugefügt, um Duplikate zu löschen: http://wesmckinney.com/blog/?p=340 . AFAICT wurde jedoch für exakte Duplikate entwickelt, sodass Kriterien für die Auswahl der beibehaltenen Zeilen nicht erwähnt werden.
Ich vermute, es gibt wahrscheinlich einen einfachen Weg, dies zu tun - vielleicht so einfach wie das Sortieren des Datenrahmens vor dem Löschen von Duplikaten -, aber ich kenne die interne Logik von groupby nicht gut genug, um es herauszufinden. Irgendwelche Vorschläge?
python
duplicates
pandas
Abe
quelle
quelle
Antworten:
Dies dauert den letzten. Nicht das Maximum:
Sie können auch so etwas tun:
quelle
cols
undtake_last
werden abgeschrieben und durch die Parametersubset
und ersetztkeep
. pandas.pydata.org/pandas-docs/version/0.17.1/generated/…FutureWarning: the take_last=True keyword is deprecated, use keep='last' instead
df.sort_values(by=['B']).drop_duplicates(subset=['A'], keep='last')
? Ich meine, diese sort_values scheinen mir sicher zu sein, aber ich habe keine Ahnung, ob es tatsächlich so ist.group_by
, können Sie hinzufügen..reset_index(drop=True)
df.groupby(['A','C'], group_keys=False).apply(lambda x: x.ix[x.B.idxmax()]).reset_index(drop=True)
Dadurch wird der Index zurückgesetzt, da sein Standardwert ein Multindex ist, der aus'A'
und'C'
Die beste Antwort ist zu viel Arbeit und scheint für größere Datenmengen sehr langsam zu sein.
apply
ist langsam und sollte nach Möglichkeit vermieden werden.ix
ist veraltet und sollte ebenfalls vermieden werden.Oder gruppieren Sie einfach nach allen anderen Spalten und nehmen Sie das Maximum der benötigten Spalte.
df.groupby('A', as_index=False).max()
quelle
lamba
Funktion beim Ablegen verallgemeinert werden kann . Wie kann ich zum Beispiel nur Werte löschen, die kleiner sind als der Durchschnitt dieser doppelten Werte?Einfachste Lösung:
So löschen Sie Duplikate basierend auf einer Spalte:
So löschen Sie Duplikate basierend auf mehreren Spalten:
quelle
Versuche dies:
quelle
Ich würde den Datenrahmen zuerst mit absteigender Spalte B sortieren, dann Duplikate für Spalte A löschen und zuerst behalten
ohne groupby
quelle
Sie können dies auch versuchen
Ich habe dies von https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html weitergeleitet
quelle
Ich denke in deinem Fall brauchst du nicht wirklich einen Groupby. Ich würde Ihre B-Spalte in absteigender Reihenfolge sortieren und dann Duplikate in Spalte A ablegen. Wenn Sie möchten, können Sie auch einen neuen schönen und sauberen Index wie diesen haben:
quelle
Hier ist eine Variation, die ich lösen musste und die es wert ist, geteilt zu werden: Für jede eindeutige Zeichenfolge in
columnA
wollte ich die häufigste zugehörige Zeichenfolge in findencolumnB
.df.groupby('columnA').agg({'columnB': lambda x: x.mode().any()}).reset_index()
Die
.any()
Auswahl eins, wenn es ein Unentschieden für den Modus gibt. (Beachten Sie, dass die Verwendung.any()
einer Reihe vonint
s einen Booleschen Wert zurückgibt, anstatt einen davon auszuwählen.)Für die ursprüngliche Frage vereinfacht sich der entsprechende Ansatz zu
df.groupby('columnA').columnB.agg('max').reset_index()
.quelle
Wenn bereits gegebene Beiträge die Frage beantworten, habe ich eine kleine Änderung vorgenommen, indem ich den Spaltennamen hinzugefügt habe, auf den die Funktion max () angewendet wird, um die Lesbarkeit des Codes zu verbessern.
quelle
Der einfachste Weg, dies zu tun:
quelle
das funktioniert auch:
quelle
Ich werde Ihnen nicht die ganze Antwort geben (ich glaube, Sie suchen sowieso nicht nach dem Parsen und Schreiben in einen Dateiteil), aber ein entscheidender Hinweis sollte ausreichen: Verwenden Sie die Python-
set()
Funktion und dannsorted()
oder.sort()
gekoppelt mit.reverse()
:quelle