Elimina tutte le righe duplicate in Panda di Python


160

La pandas drop_duplicatesfunzione è ottima per "unificare" un frame di dati. Tuttavia, uno degli argomenti delle parole chiave da passare è take_last=Trueo take_last=False, mentre vorrei eliminare tutte le righe che sono duplicate in un sottoinsieme di colonne. È possibile?

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

Ad esempio, vorrei eliminare le righe corrispondenti alle colonne Ae Cquindi ciò dovrebbe eliminare le righe 0 e 1.

Risposte:


235

Questo è molto più semplice nei panda ora con drop_duplicates e il parametro keep.

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)

2
Cosa succede se le mie colonne non sono esplicitamente etichettate? Come faccio a selezionare le colonne in base al loro indice?
Hamman Samuel,

2
Forse df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)?
Ben

5
potresti provaredf.drop_duplicates(subset=[df.columns[0:2]], keep = False)
seeiespi,

68

Voglio solo aggiungere alla risposta di Ben su drop_duplicates :

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

  • primo: elimina i duplicati tranne la prima occorrenza.

  • last: elimina i duplicati tranne l'ultima occorrenza.

  • Falso: elimina tutti i duplicati.

Quindi l'impostazione keepsu False ti darà la risposta desiderata.

DataFrame.drop_duplicates (* args, ** kwargs) Restituisce DataFrame con le righe duplicate rimosse, facoltativamente considerando solo alcune colonne

Parametri: sottoinsieme: etichetta di colonna o sequenza di etichette, opzionale Considera solo determinate colonne per identificare i duplicati, per impostazione predefinita usa tutte le colonne keep: {'first', 'last', False}, default 'first' first: Drop duplicates tranne per la prima volta. last: elimina i duplicati tranne l'ultima occorrenza. Falso: elimina tutti i duplicati. take_last: deprecated sul posto: booleano, impostazione predefinita Falso Se eliminare i duplicati sul posto o restituire una copia cols: kwargs solo argomento del sottoinsieme [deprecato] Restituisce: deduplicato: DataFrame


26

Se si desidera che i risultati vengano archiviati in un altro set di dati:

df.drop_duplicates(keep=False)

o

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

Se è necessario aggiornare lo stesso set di dati:

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

Gli esempi sopra rimuoveranno tutti i duplicati e ne manterranno uno simile a quello di DISTINCT *SQL


12

usare groupbyefilter

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)

5

In realtà, eliminare le righe 0 e 1 richiede solo (tutte le osservazioni contenenti A e C corrispondenti vengono mantenute.):

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]

Ma sospetto che quello che vuoi davvero sia questo (viene mantenuta un'osservazione contenente A e C abbinati):

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]

Modificare:

Ora è molto più chiaro, quindi:

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]

1
Se fosse quello che volevo, userei solo df.drop_duplicates(['A','C'])come impostazione predefinita per mantenere un'osservazione prendere la prima o l'ultima come ho detto nella domanda - anche se ho appena capito che avevo la parola chiave sbagliata mentre scrivevo dalla memoria. Quello che voglio è eliminare tutte le righe identiche nelle colonne di interesse (A e C nei dati di esempio).
Jamie Bull,

0

Prova queste varie cose

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')

o

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

o

>>>df.drop_duplicates( keep='last')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.