python - 如何根据其他字段提取csv文件某一字段的值?

标签 python csv

我有一个包含 4 个字段的 csv 文件; student_iddate_of_exam主题分数。我想根据每个不同的 student_idsubject 将值存储在某个列表中的 marks 字段中,以便我可以对该列表执行一些操作稍后(例如:获得平均分等)。

如果我事先有student_idsubject,我就可以做到这一点;我可以根据 csv 文件中的所有值检查它们,并存储与特定 student_idsubject 相对应的 marks (如代码片段所示)以下)。但我该如何为每个学生做到这一点呢?这是我似乎无法弄清楚的部分。

import csv

with open('results_file.csv', 'r') as f:
    reader = csv.reader(f)

    # next(reader)

    marks = []
    for line in reader:
        if line[0] == student_id and line[2] == subject:
            values.append(float(line[3]))
    print("Maximum: {}, Minimum: {}, Average: {}, Count: {}".format(max(values), min(values), sum(values) / len(values), len(values)))

csv 文件看起来像这样:

student_id,date_of_exam,subject,marks

a1,2012-05-21,Maths,45

a2,2012-05-24,Physics,48

a2,2012--5-27,Chemistry,42

a1,2012-05-15,Language,35

a2,2012-05-21,Maths,49

a3,2012-05-15,Language,47

最佳答案

您可以使用collections.defaultdict来存储每个学生/科目的分数:

import csv
from collections import defaultdict

with open('out.csv', 'r') as f:
    reader = csv.reader(f)

    next(reader)    # skip header

    marks = defaultdict(list)
    grades = defaultdict(dict)
    subjects = set()
    for (student_id, date_of_exam, subject, mark) in reader:
        marks[student_id].append(int(mark))
        grades[student_id][subject] = int(mark)
        subjects.add(subject)

    subjects = sorted(subjects)

    print('{: ^10}{: ^10}{: ^10}{: ^10}{: ^5}'.format('student_id', 'maximum', 'minimum', 'average', 'count'))
    for student, marks in marks.items():
        print('{: ^10}{: ^10}{: ^10}{: ^10.2f}{: ^5}'.format(student, max(marks), min(marks), sum(marks) / len(marks), len(marks) ))

    print()

    print('{: ^15}'.format('student\subject'), end='')
    for s in subjects:
        print('{: ^15}'.format(s), end='')

    print()

    for student_id, student_subjects in grades.items():
        print('{: ^15}'.format(student_id), end='')
        for s in subjects:
            if s in student_subjects:
                print('{: ^15}'.format(student_subjects[s]), end='')
            else:
                print('{: ^15}'.format('-'), end='')
        print()

打印:

student_id maximum   minimum   average  count
    a1        45        35      40.00     2  
    a2        49        42      46.33     3  
    a3        47        47      47.00     1  

student\subject   Chemistry      Language         Maths         Physics    
      a1              -             35             45              -       
      a2             42              -             49             48       
      a3              -             47              -              -       

关于python - 如何根据其他字段提取csv文件某一字段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56920462/

相关文章:

python - Spark 读取文件不包含模式

python - 简单的python对csv进行排序

csv - 如何使用camel-beanio跳过CSV标题行

mysql - 使用串联更新 MySQL 表

python - 为什么以下对象是 numpy 字符串而不是 datetime.datetime 对象?

python - 不明白这个用于获取列表列表中最小值的解决方案是如何工作的

python3 - 使用 socket.send() 时出现管道错误

python - 调试vagrant+docker+flask的最佳实践

python - cx_freeze 找不到 oslo 模块

csv - 如何使用 Selenium 将测试结果写入CSV文件