[使用Python3]我有一个csv文件,我想读取它并删除重复的“特殊”情况。该脚本应在遵守标头的同时将重复数据删除的csv输出到csv。

最好是通过示例来解释它。 csv文件如下所示:

ID  Name    HeaderX HeaderY HeaderZ ...
1   A       string  float   string  ...
1   A       string  float   string  ...
1   A       string  float   string  ...
2   A       string  float   string  ...
2   B       string  float   string  ...
3   A       string  float   string  ...
4   B       string  float   string  ...
5   C       string  float   string  ...
6   D       string  float   string  ...
... ...     ...     ...     ...     ...


这里有ID = 1和ID = 2的重复行,但是我想保留名称相同的所有重复行。因此,在此示例中,我想保留所有ID = 1的实例,但要删除所有ID = 2的实例。换句话说,删除名称重复超过1个的所有重复行。 (有感觉吗?!)

目前,我有以下基于this线程的代码(如下)。但是,它的操作正好相反:根据两列删除重复项,并保留所有ID = 2的实例,并删除ID = 1的行。

另外,理想情况下,我希望脚本打印出它删除的重复项的计数。

import csv

filename = 'testing.csv'
outfile = 'outfile.csv'

with open(outfile, 'w') as fout:
    writer = None
    entries = set()
    with open(filename, 'r') as fin:
        reader = csv.DictReader(fin)

        if not writer:
            writer = csv.DictWriter(fout, lineterminator='\n', fieldnames=reader.fieldnames)
            writer.writeheader()

        for row in reader:
            key = (row['ID'], row['Name'])

            if key not in entries:
                writer.writerow(row)
                entries.add(key)

最佳答案

如果行按ID排序,则可以使用以下代码。

import csv
import itertools
import operator

filename = 'testing.csv'
outfile = 'outfile.csv'
ndups = 0

with open(filename, 'r') as fin, open(outfile, 'w') as fout:
    reader = csv.DictReader(fin)
    writer = csv.DictWriter(fout, lineterminator='\n', fieldnames=reader.fieldnames)
    for id_, grp in itertools.groupby(reader, key=operator.itemgetter('ID')):
        rows = list(grp)
        if len({row['Name'] for row in rows}) > 1:
            ndups += len(rows)
            continue
        writer.writerows(rows)

print('{} duplicates.'.format(ndups))

关于python - 读取CSV并基于两列(多列)中的值删除重复的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17231053/

10-12 17:50
查看更多