gpt4 book ai didi

python - 读取 CSV 并根据两列(多列中的)中的值删除重复值

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:06 32 4
gpt4 key购买 nike

[使用 Python3] 我有一个 csv 文件,我想读取它并删除重复项的“特殊”情况。该脚本应将去重的 csv 输出到 csv,同时尊重 header 。

最好是通过示例来解释它。 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com