@TedPetrou Ich verstehe nicht, wie die von Ihnen gegebene Antwort richtig ist. Wenn ich zwei Datenrahmen habe, von denen einer eine Teilmenge des anderen ist, muss ich alle Zeilen entfernen, die sich in der Teilmenge befinden. Ich möchte keine Duplikate entfernen. Ich möchte die Teilmenge vollständig entfernen.
– Musikbox
16. Mai 2019 um 7:38 Uhr
Mögliches Duplikat des Löschens von Zeilen aus dem Datenrahmen basierend auf einer „nicht in“-Bedingung
– Jim G.
11. September 2019 um 18:33 Uhr
Ted Petrou
Die aktuell ausgewählte Lösung liefert falsche Ergebnisse. Um dieses Problem korrekt zu lösen, können wir einen Left-Join von ausführen df1 zu df2stellen Sie sicher, dass Sie zuerst nur die eindeutigen Zeilen für erhalten df2.
Zuerst müssen wir den ursprünglichen DataFrame ändern, um die Zeile mit Daten hinzuzufügen [3, 10].
Führen Sie eine Linksverknüpfung durch und eliminieren Sie Duplikate df2 so dass jede Reihe von df1 verbindet sich mit genau 1 Reihe von df2. Verwenden Sie den Parameter indicator um eine zusätzliche Spalte zurückzugeben, die angibt, aus welcher Tabelle die Zeile stammt.
Einige Lösungen machen den gleichen Fehler – sie prüfen nur, ob jeder Wert unabhängig voneinander in jeder Spalte steht, nicht zusammen in derselben Zeile. Hinzufügen der letzten Zeile, die eindeutig ist, aber die Werte aus beiden Spalten enthält df2 deckt den Fehler auf:
Diese Lösung liefert das gleiche falsche Ergebnis:
df1.isin(df2.to_dict('l')).all(1)
aber ich nehme an, sie gingen davon aus, dass col1 eindeutig ist und ein Index ist (in der Frage nicht erwähnt, aber offensichtlich). Wenn es also niemals einen solchen Fall gibt, in dem es zwei Werte von col2 für denselben Wert von col1 gibt (es kann nicht zwei Spalten col1=3 geben), sind die obigen Antworten korrekt.
– paschut
6. November 2017 um 8:38 Uhr
Es ist sicherlich nicht offensichtlich, also ist Ihr Punkt ungültig. Meine Lösung lässt sich auf mehr Fälle verallgemeinern.
– Ted Petrou
6. November 2017 um 13:54 Uhr
Frage, wäre es nicht einfacher, ein Slice als ein boolesches Array zu erstellen? Da das Ziel darin besteht, die Zeilen zu erhalten.
– Matías Romo
20. Februar 2019 um 2:50 Uhr
Verwenden df_all[df_all['_merge'] == 'left_only'] um ein df mit den Ergebnissen zu haben
– gies0r
15. Mai 2019 um 9:38 Uhr
Für Neuankömmlinge ist das Hinzufügen der zusätzlichen Zeile ohne Erklärung verwirrend. Dann macht @gies0r diese Lösung besser. Außerdem würde ich vorschlagen, zu verwenden how='outer' so, dass die _merge Spalte hat links/rechts/beide, was verständlicher ist, wenn zukünftige Leser versuchen, die Lösung auf ihre Probleme anzuwenden.
– Yeliabsalohcin
9. September 2021 um 14:46 Uhr
EdChum
Eine Methode wäre, das Ergebnis einer inneren Zusammenführung aus beiden dfs zu speichern, dann können wir einfach die Zeilen auswählen, wenn die Werte einer Spalte nicht so gemeinsam sind:
df1[~df1.isin(df2)].dropna(how = 'all') scheint den Trick zu tun. Trotzdem danke – Ihre Antwort hat mir geholfen, eine Lösung zu finden.
– schöne Dinge denken
6. März 2015 um 15:48 Uhr
Würden Sie gerne erklären, was ~ tut in Ihrem Code df1[~df1.isin(df2)] bitte? Kann nichts daraus googeln, da es nur ein Symbol ist. Vielen Dank.
– Bowen Liu
29. Oktober 2018 um 16:03 Uhr
@BowenLiu es negiert den Ausdruck, im Grunde heißt es, wählen Sie alle aus, die NICHT IN statt IN sind.
– Weg
24. August 2020 um 11:25 Uhr
@thinknicethings, es könnte einfacher sein: df1[~df1.index.isin(df2.index)]
– Gill Bates
5. Juni 2021 um 9:13 Uhr
Unter der Annahme, dass die Indizes in den Datenrahmen konsistent sind (ohne Berücksichtigung der tatsächlichen Spaltenwerte):
df1[~df1.index.isin(df2.index)]
Rune Lyngsoe
Wie bereits angedeutet, erfordert isin für eine Übereinstimmung, dass Spalten und Indizes gleich sind. Wenn nur der Zeileninhalt übereinstimmen soll, besteht eine Möglichkeit, die Maske zum Filtern der vorhandenen Zeilen zu erhalten, darin, die Zeilen in einen (Multi-)Index umzuwandeln:
Wenn der Index berücksichtigt werden soll, hat set_index das Schlüsselwortargument append, um Spalten an den vorhandenen Index anzuhängen. Wenn Spalten nicht ausgerichtet sind, kann list(df.columns) durch Spaltenspezifikationen ersetzt werden, um die Daten auszurichten.
könnte alternativ verwendet werden, um die Indizes zu erstellen, obwohl ich bezweifle, dass dies effizienter ist.
Pragalbh kulshrestha
Angenommen, Sie haben zwei Datenrahmen, df_1 und df_2 mit mehreren Feldern (Spaltennamen), und Sie möchten anhand einiger Felder (z. B. fields_x, fields_y) nur die Einträge in df_1 finden, die nicht in df_2 enthalten sind. Führen Sie die folgenden Schritte aus.
Schritt 1. Fügen Sie jeweils eine Spalte key1 und key2 zu df_1 und df_2 hinzu.
Schritt 2. Führen Sie die Datenrahmen wie unten gezeigt zusammen. field_x und field_y sind unsere gewünschten Spalten.
Schritt 3. Wählen Sie nur die Zeilen aus df_1 aus, in denen Schlüssel1 nicht gleich Schlüssel2 ist.
Step4.Drop key1 und key2.
Diese Methode löst Ihr Problem und funktioniert auch bei großen Datensätzen schnell. Ich habe es für Datenrahmen mit mehr als 1.000.000 Zeilen ausprobiert.
Ich glaube nicht, dass dies technisch gesehen das ist, was er will – er möchte wissen, welche Zeilen für welche df eindeutig waren. aber ich denke, diese Lösung gibt einen df von Zeilen zurück, die entweder für den ersten df oder den zweiten df eindeutig waren.
Beachten Sie, dass dupliziertes Löschen verwendet wird, um die Vergleiche zu minimieren. Es würde auch ohne sie funktionieren. Der beste Weg ist, die Zeileninhalte selbst zu vergleichen und nicht den Index oder eine/zwei Spalten, und derselbe Code kann auch für andere Filter wie „both“ und „right_only“ verwendet werden, um ähnliche Ergebnisse zu erzielen. Für diese Syntax können Datenrahmen eine beliebige Anzahl von Spalten und sogar unterschiedliche Indizes haben. Nur die Spalten sollten in beiden Datenrahmen vorkommen.
Warum ist dies der beste Weg?
index.difference funktioniert nur für eindeutige indexbasierte Vergleiche
pandas.concat() zusammen mit drop_duplicated() ist nicht ideal, da es auch die Zeilen entfernt, die sich möglicherweise nur in dem Datenrahmen befinden, den Sie behalten möchten, und aus triftigen Gründen dupliziert werden.
Ich glaube nicht, dass dies technisch gesehen das ist, was er will – er möchte wissen, welche Zeilen für welche df eindeutig waren. aber ich denke, diese Lösung gibt einen df von Zeilen zurück, die entweder für den ersten df oder den zweiten df eindeutig waren.
– MetaStack
30. August 2016 um 20:37 Uhr
Gemeinschaft
ein bisschen spät, aber es könnte sich lohnen, den Parameter “indicator” von pd.merge zu überprüfen.
Ein Beispiel finden Sie in dieser anderen Frage: Vergleichen Sie PandaS DataFrames und geben Sie Zeilen zurück, die in der ersten fehlen
Ja! Auch hier: stackoverflow.com/questions/49487263/…
– Dan
3. April 2019 um 7:00 Uhr
10934000cookie-checkPandas erhalten Zeilen, die sich NICHT in einem anderen Datenrahmen befindenyes
@TedPetrou Ich verstehe nicht, wie die von Ihnen gegebene Antwort richtig ist. Wenn ich zwei Datenrahmen habe, von denen einer eine Teilmenge des anderen ist, muss ich alle Zeilen entfernen, die sich in der Teilmenge befinden. Ich möchte keine Duplikate entfernen. Ich möchte die Teilmenge vollständig entfernen.
– Musikbox
16. Mai 2019 um 7:38 Uhr
Mögliches Duplikat des Löschens von Zeilen aus dem Datenrahmen basierend auf einer „nicht in“-Bedingung
– Jim G.
11. September 2019 um 18:33 Uhr