2012-10-12 10 views
11

Ho un file CSV come questo:Come rimuovere i duplicati in un file CSV basato su due colonne?

column1 column2 

john  kerry 
adam  stephenson 
ashley  hudson 
john  kerry 
etc.. 

voglio rimuovere i duplicati da questo file, per ottenere solo:

column1 column2 

john  kerry 
adam  stephenson 
ashley  hudson 

ho scritto questo script che rimuove i duplicati in base lastnames, ma io è necessario rimuovere i duplicati in base ai cognomi e al nome.

import csv 

reader=csv.reader(open('myfilewithduplicates.csv', 'r'), delimiter=',') 
writer=csv.writer(open('myfilewithoutduplicates.csv', 'w'), delimiter=',') 

lastnames = set() 
for row in reader: 
    if row[1] not in lastnames: 
     writer.writerow(row) 
     lastnames.add(row[1]) 
+0

"Ho scritto questo script che rimuove i duplicati in base ai nomi, ma ho bisogno di rimuovere i duplicati in base al nome E al nome." Sono confuso qui. Quando dici il nome vuoi dire il nome, il cognome o una concatenazione? Il tuo script funziona solo sui cognomi. – Jeff

+0

Ci scusiamo per non essere chiari, voglio rimuovere i duplicati in base a cognomi (colonna2) e nomi (colonna1) – Reveclair

risposta

18

Tu sei davvero vicino. Usa quelle colonne come la voce impostata

entries = set() 

for row in reader: 
    key = (row[0], row[1]) # instead of just the last name 

    if key not in entries: 
     writer.writerow(row) 
     entries.add(key) 
+1

Soluzione elegante =) – Mac

+0

Grande risposta uomo - Io sostengo completamente questo sul mio :) +1 – RocketDonkey

1

Un modo veloce sarebbe quello di creare un unico insieme di righe utilizzando la seguente tecnica (adottato da @CedricJulien da this post). Si perde la DictWriter vantaggio di avere i nomi delle colonne memorizzate in ogni riga, ma dovrebbe funzionare per voi caso:

>>> import csv 
>>> with open('testcsv1.csv', 'r') as f: 
... reader = csv.reader(f) 
... uniq = [list(tup) for tup in set([tuple(row) for row in reader])] 
... 
>>> with open('nodupes.csv', 'w') as f: 
... writer=csv.writer(f) 
... for row in uniq: 
...  writer.writerow(row) 

Questo utilizza la stessa tecnica usata da @CedricJulien, che è un bel uno-liner per rimuovere il righe duplicate (definite come lo stesso nome e cognome). Questo utilizza i DictReader/DictWriter classi:

>>> import csv 
>>> with open('testcsv1.csv', 'r') as f: 
... reader = csv.DictReader(f) 
... rows = [row for row in reader] 
... 
>>> uniq = [dict(tup) for tup in set(tuple(person.items()) for person in rows)] 
>>> with open('nodupes.csv', 'w') as f: 
... headers = ['column1', 'column2'] 
... writer = csv.DictWriter(f, fieldnames=headers) 
... writer.writerow(dict((h, h) for h in headers)) 

... for row in uniq: 
...  writer.writerow(row) 
... 
11

Ora è possibile utilizzare il metodo .drop_duplicates nei panda. Vorrei fare quanto segue:

import pandas as pd 
toclean = pd.read_csv('myfilewithduplicates.csv') 
deduped = toclean.drop_duplicates([col1,col2]) 
deduped.to_csv('myfilewithoutduplicates.csv') 
Problemi correlati