Löschen Sie alle doppelten Zeilen in Python Pandas

157

Die pandas drop_duplicatesFunktion eignet sich hervorragend zum "Eindeutigen" eines Datenrahmens. Eines der zu übergebenden Schlüsselwortargumente ist jedoch take_last=Trueoder take_last=False, während ich alle Zeilen löschen möchte, die Duplikate in einer Teilmenge von Spalten sind. Ist das möglich?

    A   B   C
0   foo 0   A
1   foo 1   A
2   foo 1   B
3   bar 1   A

Als Beispiel möchte ich Zeilen löschen, die mit Spalten übereinstimmen, Aund Cdaher sollten die Zeilen 0 und 1 gelöscht werden.

Jamie Bull
quelle

Antworten:

232

Dies ist in Pandas jetzt mit drop_duplicates und dem Parameter keep viel einfacher .

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)
Ben
quelle
2
Was ist, wenn meine Spalten nicht explizit gekennzeichnet sind? Wie wähle ich die Spalten nur anhand ihres Index aus?
Hamman Samuel
2
Vielleicht df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)?
Ben
5
Sie könnten versuchendf.drop_duplicates(subset=[df.columns[0:2]], keep = False)
Seeiespi
67

Ich möchte nur zu Bens Antwort auf drop_duplicates hinzufügen :

keep : {'first', 'last', False}, Standard 'first'

  • first: Löschen Sie Duplikate mit Ausnahme des ersten Vorkommens.

  • last: Löscht Duplikate mit Ausnahme des letzten Vorkommens.

  • False: Alle Duplikate löschen.

Wenn Sie also keepauf Falsch setzen, erhalten Sie die gewünschte Antwort.

DataFrame.drop_duplicates (* args, ** kwargs) Gibt DataFrame mit entfernten doppelten Zeilen zurück, optional nur unter Berücksichtigung bestimmter Spalten

Parameter: Teilmenge: Spaltenbezeichnung oder Reihenfolge der Bezeichnungen, optional Berücksichtigen Sie nur bestimmte Spalten zum Identifizieren von Duplikaten. Verwenden Sie standardmäßig alle Spalten. Behalten Sie Folgendes bei: {'first', 'last', False}, default 'first' first: Löschen Sie Duplikate außer für das erste Vorkommen. last: Löscht Duplikate mit Ausnahme des letzten Vorkommens. False: Alle Duplikate löschen. take_last: veraltet inplace: boolean, default False Gibt an, ob Duplikate an Ort und Stelle gelöscht oder eine Kopie zurückgegeben werden soll. cols: kwargs only Argument der Teilmenge [veraltet] Rückgabe: dedupliziert: DataFrame

Jake
quelle
25

Wenn das Ergebnis in einem anderen Datensatz gespeichert werden soll:

df.drop_duplicates(keep=False)

oder

df.drop_duplicates(keep=False, inplace=False)

Wenn derselbe Datensatz aktualisiert werden muss:

df.drop_duplicates(keep=False, inplace=True)

In den obigen Beispielen werden alle Duplikate entfernt und eines beibehalten, ähnlich wie DISTINCT *in SQL

Ramanujam Allam
quelle
11

benutze groupbyundfilter

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)
HYRY
quelle
4

Tatsächlich erfordert das Löschen der Zeilen 0 und 1 nur (alle Beobachtungen, die übereinstimmende A und C enthalten, werden beibehalten.):

In [335]:

df['AC']=df.A+df.C
In [336]:

print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'.
     A  B  C    AC
2  foo  1  B  fooB
3  bar  1  A  barA

[2 rows x 4 columns]

Aber ich vermute, was Sie wirklich wollen, ist Folgendes (eine Beobachtung mit übereinstimmenden A und C wird beibehalten.):

In [337]:

print df.drop_duplicates('AC')
     A  B  C    AC
0  foo  0  A  fooA
2  foo  1  B  fooB
3  bar  1  A  barA

[3 rows x 4 columns]

Bearbeiten:

Jetzt ist es also viel klarer:

In [352]:
DG=df.groupby(['A', 'C'])   
print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1])
     A  B  C
2  foo  1  B
3  bar  1  A

[2 rows x 3 columns]
CT Zhu
quelle
1
Wenn es das war, was ich wollte, würde ich nur df.drop_duplicates(['A','C'])als Standard verwenden, dass eine Beobachtung die erste oder letzte nimmt, wie ich in der Frage erwähnt habe - obwohl ich gerade festgestellt habe, dass ich das Schlüsselwort falsch hatte, als ich aus dem Speicher schrieb. Ich möchte alle Zeilen löschen, die in den interessierenden Spalten identisch sind (A und C in den Beispieldaten).
Jamie Bull
-1

Probieren Sie diese verschiedenen Dinge aus

df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})

>>>df.drop_duplicates( "A" , keep='first')

oder

>>>df.drop_duplicates( keep='first')

oder

>>>df.drop_duplicates( keep='last')
Priyansh Gupta
quelle