2012-10-12 10 views
11

Ich habe eine CSV-Datei wie folgt aus:Wie Duplikate in einer CSV-Datei zu entfernen, basiert auf zwei Säulen?

column1 column2 

john  kerry 
adam  stephenson 
ashley  hudson 
john  kerry 
etc.. 

ich Duplikate aus dieser Datei entfernen möchten, nur erhalten:

column1 column2 

john  kerry 
adam  stephenson 
ashley  hudson 

ich dieses Skript geschrieben, das auf lastnames Duplikate basierend entfernt, aber ich müssen Duplikate basierend auf Nachnamen UND Vornamen entfernen.

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

"Ich schrieb dieses Skript, das Duplikate basierend auf Namen entfernt, aber ich muss die Duplikate basierend auf Name und Vorname entfernen." Ich bin hier verwirrt. Wenn du Namen sagst, meinst du Vorname, Nachname oder eine Verkettung? Dein Skript funktioniert nur mit Nachnamen. – Jeff

+0

Sorry für Unklarheiten, ich möchte Duplikate basierend auf Nachnamen (Spalte2) und Vornamen (Spalte1) entfernen – Reveclair

Antwort

18

Sie sind ganz in der Nähe. Verwenden Sie diese Spalten als Set-Eintrag

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

Elegante Lösung =) – Mac

+0

Große Antwort Mann - ich unterstütze dies völlig über meine :) +1 – RocketDonkey

1

Eine schnelle Möglichkeit, einen einzigartigen Satz von Zeilen zu erstellen wäre die folgende Technik (angenommen von @CedricJulien aus this post). Sie verlieren die DictWriter Nutzen der Spaltennamen in jeder Zeile gespeichert ist, aber es sollte für Sie arbeiten Fall:

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

Dies verwendet die gleiche Technik, die von @CedricJulien verwendet, was ein netter Einzeiler ist zu entfernen doppelte Zeilen (definiert als derselbe Vorname und Nachname). Dies nutzt die DictReader/DictWriter Klassen:

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

Sie können jetzt die .drop_duplicates-Methode in Pandas verwenden. Ich würde folgendes tun:

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