2012-10-12 31 views
11

Tôi có một tập tin csv như thế này:Làm thế nào để loại bỏ các bản sao trong một tập tin csv dựa trên hai cột?

column1 column2 

john  kerry 
adam  stephenson 
ashley  hudson 
john  kerry 
etc.. 

Tôi muốn gỡ bỏ bản sao từ tập tin này, để có được chỉ:

column1 column2 

john  kerry 
adam  stephenson 
ashley  hudson 

tôi đã viết kịch bản này mà loại bỏ bản sao dựa trên lastnames, nhưng tôi cần phải loại bỏ các bản sao dựa trên họ và tên.

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

"Tôi đã viết tập lệnh này loại bỏ các từ khóa trùng lặp dựa trên tên, nhưng tôi cần xóa các bản sao trùng lặp dựa trên tên VÀ tên." Tôi bối rối ở đây. Khi bạn nói tên bạn có nghĩa là tên, họ hoặc một nối? Tập lệnh của bạn chỉ hoạt động trên họ. – Jeff

+0

Xin lỗi vì không rõ ràng, tôi muốn xóa các bản sao dựa trên họ (column2) và tên (cột1) – Reveclair

Trả lời

18

Bạn đang thực sự gần gũi. Sử dụng các cột đó làm mục nhập được đặt

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

Giải pháp thanh lịch =) – Mac

+0

Người trả lời tuyệt vời - Tôi hỗ trợ đầy đủ điều này đối với tôi :) +1 – RocketDonkey

1

Một cách nhanh chóng sẽ tạo ra một bộ duy nhất của hàng bằng cách sử dụng kỹ thuật sau đây (áp dụng từ @CedricJulien từ this bưu điện). Bạn mất DictWriter lợi ích của việc có các tên cột được lưu trữ trong mỗi hàng, nhưng nó phải làm việc cho bạn trường hợp:

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

này sử dụng kỹ thuật tương tự được sử dụng bởi @CedricJulien, mà là một đẹp một lót để loại bỏ các hàng trùng lặp (được định nghĩa là cùng tên và họ). Này sử dụng DictReader/DictWriter lớp:

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

Bây giờ bạn có thể sử dụng phương pháp .drop_duplicates trong gấu trúc. Tôi sẽ làm như sau:

import pandas as pd 
toclean = pd.read_csv('myfilewithduplicates.csv') 
deduped = toclean.drop_duplicates([col1,col2]) 
deduped.to_csv('myfilewithoutduplicates.csv') 
Các vấn đề liên quan