【问题标题】:Python: how to group rows by one column and pick one row by another column?Python:如何按一列分组行并按另一列选择一行?
【发布时间】: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

我试图找到有关此的帖子,但失败了。有没有使用内置库的方法来做到这一点?

【问题讨论】:

    标签: python csv merge


    【解决方案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])
    

    【讨论】:

      猜你喜欢
      • 2017-01-22
      • 1970-01-01
      • 2019-02-18
      • 2020-10-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      相关资源
      最近更新 更多