基于两列删除 csv 文件中的重复项?
Remove duplicates in a csv file based on two columns?
我有一个 CSV 文件,必须读取它并在写入之前删除重复值。
重复值将基于两列(日期、价格)(AND 条件语句)。因此,在下面的示例中,第 1 行、第 2 行和第 4 行将写入 CSV。第 3 行有资格作为重复项(因为相同的日期和价格与第 1 行匹配)并且将被排除(不写入 CSV)。
address floor date price
40 B STREET 18 3/29/2015 2200000
40 B STREET 23 1/7/2015 999000
40 B STREET 18 3/29/2015 2200000
40 B STREET 18 4/29/2015 2200000
您可以使用 set
来保留写入的行并在每次迭代检查中,如果该行已写入则不要写入它,并使用 tempfile.NamedTemporaryFile
重写您的文件:
import csv
from tempfile import NamedTemporaryFile
import shutil
seen=set()
tempfile = NamedTemporaryFile(delete=False)
with open('file_name.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter='\t')
spamwriter = csv.writer(csvfile, delimiter='\t')
for row in spamreader:
date=row[2]
if date not in seen:
spamwriter.writerow(row)
seen.add(date)
shutil.move(tempfile.name, file_name)
您可以使用 DictReader
和 DictWriter
来完成您的任务。
import csv
def main():
"""Read csv file, delete duplicates and write it."""
with open('test.csv', 'r',newline='') as inputfile:
with open('testout.csv', 'w', newline='') as outputfile:
duplicatereader = csv.DictReader(inputfile, delimiter=',')
uniquewrite = csv.DictWriter(outputfile, fieldnames=['address', 'floor', 'date', 'price'], delimiter=',')
uniquewrite.writeheader()
keysread = []
for row in duplicatereader:
key = (row['date'], row['price'])
if key not in keysread:
print(row)
keysread.append(key)
uniquewrite.writerow(row)
if __name__ == '__main__':
main()
虽然不在标准库中,pandas
非常适合这类事情:
import pandas as pd
records = pd.read_csv('test.csv')
deduped = records.drop_duplicates(['date', 'price'])
deduped.to_csv('deduped.csv', index=False)
这种方法的缺点是所有数据都被一次性读入内存。但是,如果您的数据集适合内存,那么增加清晰度和表现力可能是值得的 - 特别是如果您要像这样对表格数据进行额外操作。
我有一个 CSV 文件,必须读取它并在写入之前删除重复值。
重复值将基于两列(日期、价格)(AND 条件语句)。因此,在下面的示例中,第 1 行、第 2 行和第 4 行将写入 CSV。第 3 行有资格作为重复项(因为相同的日期和价格与第 1 行匹配)并且将被排除(不写入 CSV)。
address floor date price
40 B STREET 18 3/29/2015 2200000
40 B STREET 23 1/7/2015 999000
40 B STREET 18 3/29/2015 2200000
40 B STREET 18 4/29/2015 2200000
您可以使用 set
来保留写入的行并在每次迭代检查中,如果该行已写入则不要写入它,并使用 tempfile.NamedTemporaryFile
重写您的文件:
import csv
from tempfile import NamedTemporaryFile
import shutil
seen=set()
tempfile = NamedTemporaryFile(delete=False)
with open('file_name.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter='\t')
spamwriter = csv.writer(csvfile, delimiter='\t')
for row in spamreader:
date=row[2]
if date not in seen:
spamwriter.writerow(row)
seen.add(date)
shutil.move(tempfile.name, file_name)
您可以使用 DictReader
和 DictWriter
来完成您的任务。
import csv
def main():
"""Read csv file, delete duplicates and write it."""
with open('test.csv', 'r',newline='') as inputfile:
with open('testout.csv', 'w', newline='') as outputfile:
duplicatereader = csv.DictReader(inputfile, delimiter=',')
uniquewrite = csv.DictWriter(outputfile, fieldnames=['address', 'floor', 'date', 'price'], delimiter=',')
uniquewrite.writeheader()
keysread = []
for row in duplicatereader:
key = (row['date'], row['price'])
if key not in keysread:
print(row)
keysread.append(key)
uniquewrite.writerow(row)
if __name__ == '__main__':
main()
虽然不在标准库中,pandas
非常适合这类事情:
import pandas as pd
records = pd.read_csv('test.csv')
deduped = records.drop_duplicates(['date', 'price'])
deduped.to_csv('deduped.csv', index=False)
这种方法的缺点是所有数据都被一次性读入内存。但是,如果您的数据集适合内存,那么增加清晰度和表现力可能是值得的 - 特别是如果您要像这样对表格数据进行额外操作。