2013-07-01 5 views
2

У меня есть CSV-файл, как это:Python: как группировать строки по одному столбцу и выбирать одну строку за другим столбцом?

student | score 
John | A 
John | C 
Mary | B 
Mary | D 
Kim  | B 
Kim  | A 

Каждый студент имеет несколько баллов, и я хочу, чтобы объединить информацию балла по уникальной студент с наибольшим количеством очков.

Я хочу, чтобы иметь таблицу, как это в результате:

student | score 
John | A 
Mary | B 
Kim  | A 

Я пытался найти пост об этом, но не удалось. Есть ли какой-либо подход для этого, используя встроенную библиотеку?

ответ

1

Используйте словарь и сохраняйте только самое высокое значение, найденное до сих пор. Поскольку баллы даются как буквы, это означает, что вам нужно найти «низкий» письмо, lexographically:

import csv 

students = {} 

with open(inputcsvfile, 'rb') as scoressource: 
    reader = csv.reader(scoressource) 
    for name, score in reader: 
     if score < students.get(name, 'Z'): 
      students[name] = score 

with open(outputcsvfile, 'wb') as scoresdest: 
    writer = csv.writer(scoresdest) 
    for name, score in students.iteritems(): 
     writer.writerow([name, score]) 
2

Группа по имени студента, используя itertools.groupby.

import csv 
import itertools 
import operator 

with open('1.csv') as f, open('2.csv', 'w') as fout: 
    reader = csv.DictReader(f, delimiter='|') 
    writer = csv.DictWriter(fout, fieldnames=reader.fieldnames, delimiter='|') 
    writer.writeheader() 
    for student, group in itertools.groupby(reader, key=operator.itemgetter('student')): 
     max_score = min(map(operator.itemgetter('score'), group)) 
     writer.writerow({'student': student, 'score': max_score}) 
+0

Отличный ответ. Возможно, не было больше Pythonic IMO. –

Смежные вопросы