[使用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/