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:如何按一列分组行并按另一列选择一行?的主要内容,如果未能解决你的问题,请参考以下文章

如何按一列的最大值获取SQL行,按另一列分组

按列分组,结果限制并按另一列轨道排序

计算 20 秒间隔内的平均值并按另一列分组

如何在按另一列排序时按一列过滤?

MySQL - 选择列值仅为0的行,按另一列分组?

Python Pandas:按一列分组,仅在另一列中聚合,但取相应数据