Python 2.7 CSV:如何根据值删除重复的行

时间:2014-05-23 00:31:21

标签: python csv

我有一个csv文件,格式如下:

name, id, date, score
chris, 55, 5/22/2014, 70
pete, 56, 5/22/2014, 100
chris, 55, 5/22/2014, 100

我正在尝试按名称排序,然后找到重复的条目并删除分数最低的副本。我已经完成了排序,我坚持其余的。

分类代码:

import csv

sortedlist = None

with open('my_file.csv', 'r') as zfile:
    sortedlist = sorted(zfile, key=operator.itemgetter(0), reverse=False)
    for line in sortedlist:
        line = line.rstrip()
        print line

1 个答案:

答案 0 :(得分:2)

这是你想要的(使用functionali style ):

#!/usr/bin/env python


import csv
from pprint import pprint
from operator import itemgetter


INPUT = """\
name, id, date, score
chris, 55, 5/22/2014, 70
pete, 56, 5/22/2014, 100
chris, 55, 5/22/2014, 100"""


reader = csv.reader(INPUT.split("\n"))
rows = iter(reader)
next(rows)  # skip header
sort_key = itemgetter(0, 3)
sorted_rows = reversed(sorted(rows, key=sort_key))
unique_rows = dict((row[1], row) for row in sorted_rows)

pprint(unique_rows)

<强>输出:

$ python -i foo.py
{' 55': ['chris', ' 55', ' 5/22/2014', ' 100'],
 ' 56': ['pete', ' 56', ' 5/22/2014', ' 100']}
>>>

按名称对此输出进行排序很简单:

>>> pprint(sorted(unique_rows.values(), key=itemgetter(0)))
[['chris', ' 55', ' 5/22/2014', ' 100'], ['pete', ' 56', ' 5/22/2014', ' 100']]

注意:

  • 使用csv模块读取数据,因为它的逗号分隔值明确(CSV)。
  • 根据0th名称)项目 3rd得分)的键对行进行排序项目
  • 将排序顺序从最低分数反转到最高分数(你会看到原因
  • 将此映射到dict(键/值对)从最低到最高的分数。

任何基于具有较高分数的id的重复条目将取代较低分数的条目 所以你得到了你正在寻找的输出/结果。