Python:如何按一列分组行并按另一列选择一行?
Posted
技术标签:
【中文标题】Python:如何按一列分组行并按另一列选择一行?【英文标题】:Python: how to group rows by one column and pick one row by another column? 【发布时间】:2013-06-28 06:49:14 【问题描述】:我有一个这样的 CSV 文件:
student | score
John | A
John | C
Mary | B
Mary | D
Kim | B
Kim | A
每个学生都有多个分数,我想将分数信息合并到分数最高的唯一学生下。
我想要一个这样的表格作为结果:
student | score
John | A
Mary | B
Kim | A
我试图找到有关此的帖子,但失败了。有没有使用内置库的方法来做到这一点?
【问题讨论】:
【参考方案1】:使用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)
【讨论】:
很好的答案。不能再像 Pythonic IMO 了。【参考方案2】:使用字典,只存储目前找到的最高值。因为分数是以字母形式给出的,这意味着您需要按字典顺序找到“最低”的字母:
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])
【讨论】:
以上是关于Python:如何按一列分组行并按另一列选择一行?的主要内容,如果未能解决你的问题,请参考以下文章