【问题标题】:How to remove duplicates in a csv file based on two columns?如何根据两列删除csv文件中的重复项?
【发布时间】:2013-06-13 10:29:25
【问题描述】:

我有一个这样的 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] )

【问题讨论】:

  • “我编写了这个脚本,它根据名称删除重复项,但我需要根据名称和名字删除重复项。”我在这里很困惑。当你说名字时,你的意思是名字,姓氏还是串联?您的脚本仅适用于姓氏。
  • 抱歉不清楚,我想删除基于姓氏(column2)和名字(column1)的重复项

标签: python


【解决方案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】:

    您现在可以在 pandas 中使用 .drop_duplicates 方法。我会做以下事情:

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

    【讨论】:

      【解决方案3】:

      一种快速的方法是使用以下技术创建一组唯一的行(来自this 帖子的@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)
      ...
      

      【讨论】:

        猜你喜欢
        • 2017-03-02
        • 2021-02-09
        • 2021-03-20
        • 2015-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-11
        • 2017-07-06
        相关资源
        最近更新 更多