Как удалить дубликаты в файле csv на основе двух столбцов?
У меня есть файл csv:
column1 column2
john kerry
adam stephenson
ashley hudson
john kerry
etc..
Я хочу удалить дубликаты из этого файла, чтобы получить только:
column1 column2
john kerry
adam stephenson
ashley hudson
Я написал этот script, который удаляет дубликаты на основе lastnames, но мне нужно удалить дубликаты на основе lastnames AND firstname.
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] )
Ответы
Ответ 1
Ты действительно рядом. Используйте эти столбцы как установленную запись
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)
Ответ 2
Теперь вы можете использовать метод .drop_duplicates в pandas. Я бы сделал следующее:
import pandas as pd
toclean = pd.read_csv('myfilewithduplicates.csv')
deduped = toclean.drop_duplicates([col1,col2])
deduped.to_csv('myfilewithoutduplicates.csv')
Ответ 3
Быстрый способ состоял бы в создании уникального набора строк с использованием следующей техники (принятой из @CedricJulien из этой публикации). Вы теряете преимущество DictWriter
наличия имен столбцов, хранящихся в каждой строке, но оно должно работать для вас:
>>> 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)
В этом случае используется тот же метод, который используется @CedricJulien, который является хорошим однострочным шрифтом для удаления повторяющихся строк (определяемых как одно и то же имя и фамилия). Это использует классы DictReader
/DictWriter
:
>>> 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)
...