2012-10-12 135 views
11

Tengo un archivo csv como esto:¿Cómo eliminar duplicados en un archivo csv basado en dos columnas?

column1 column2 

john  kerry 
adam  stephenson 
ashley  hudson 
john  kerry 
etc.. 

Quiero eliminar los duplicados de este archivo, para obtener sólo:

column1 column2 

john  kerry 
adam  stephenson 
ashley  hudson 

Escribí este script que elimina los duplicados basado en apellidos, pero necesita eliminar duplicados basados ​​en apellidos Y nombre.

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

"Escribí esta secuencia de comandos que elimina los duplicados en función de los nombres, pero necesito eliminar los duplicados según el nombre Y el nombre." Estoy confundido aquí. Cuando dices nombre, ¿te refieres al primer nombre, apellido o una concatenación? Tu script solo funciona con los apellidos. – Jeff

+0

Lo siento por no estar claro, quiero eliminar duplicados basados ​​en los apellidos (columna2) y los primeros nombres (columna1) – Reveclair

Respuesta

18

usted está realmente cerca. Use esas columnas como la entrada establecida

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

Solución elegante =) – Mac

+0

Gran respuesta hombre - Apoyo totalmente esto sobre el mío :) +1 – RocketDonkey

1

Una forma rápida sería la creación de un conjunto único de filas utilizando la técnica siguiente (adoptado de @CedricJulien de this post). Se pierde la DictWriter beneficio de tener almacenados los nombres de columna en cada fila, pero debería funcionar para usted 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) 

Este utiliza la misma técnica utilizada por @CedricJulien, que es un agradable de una sola línea para eliminar el filas duplicadas (definidas como el mismo nombre y apellido). Esto utiliza las DictReader/DictWriter clases:

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

Ahora puede usar el método .drop_duplicates en pandas. Haría lo siguiente:

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