12

私はこのようなcsvファイルを持っています:

column1    column2

john       kerry
adam       stephenson
ashley     hudson
john       kerry
etc..

このファイルから重複を削除して、次の情報のみを取得したい:

column1    column2

john       kerry
adam       stephenson
ashley     hudson

姓に基づいて重複を削除するこのスクリプトを作成しましたが、姓と名に基づいて重複を削除する必要があります。

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

3 に答える 3

20

あなたは本当に近いです。それらの列をセットエントリとして使用します

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)
于 2012-10-12T01:50:03.410 に答える
12

パンダで.drop_duplicatesメソッドを使用できるようになりました。私は次のことをします:

import pandas as pd
toclean = pd.read_csv('myfilewithduplicates.csv')
deduped = toclean.drop_duplicates([col1,col2])
deduped.to_csv('myfilewithoutduplicates.csv')
于 2013-06-13T02:29:25.773 に答える
1

簡単な方法は、次の手法を使用して一意の行セットを作成することです(この投稿の@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)
...
于 2012-10-12T01:36:16.997 に答える