У меня есть CSV-файл с 4 полями; student_id, date_of_exam, subject и marks. Я хочу сохранить значения в поле marks в каком-либо списке на основе различных student_id и subject, чтобы позже я мог выполнить некоторые операции с этим списком (например, получить средние оценки и т. Д. ) .

Я могу сделать это, если у меня есть student_id и subject заранее; Я могу проверить их по всем значениям в CSV-файле и сохранить marks, соответствующие этим конкретным student_id и subject (как показано в фрагменте кода ниже). Но как мне сделать это для каждого студента? Это та часть, которую я не могу понять.

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
1
Rahul Bohare 7 Июл 2019 в 11:23

3 ответа

Лучший ответ

Вы можете использовать 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              -              -       
1
Andrej Kesely 7 Июл 2019 в 11:25

Вы можете использовать словари:

grades_per_student = {}
grades_per_subject = {}

with open('results_file.csv', 'r') as f:
    reader = csv.reader(f)
    for line in reader:
        if line[0] in grades_per_student.keys():
            grades_per_student[line[0]].append(line[-1])
        else:
            grades_per_student[line[0]] = [line[-1]]
        if line[2] in grades_per_subject.keys():
            grades_per_subject[line[2]].append(line[-1])
        else:
            grades_per_subject[line[2]] = [line[-1]]

Результат:

grades_per_student = {'a1': [45, 35], 'a2': [48, 42,49], 'a3': [47]}
grades_per_subjects = {'Maths': [45, 49], 'Physics': [48], 'Chemistry': [42], 'Language': [35, 47]}
1
Afik Friedberg 7 Июл 2019 в 08:36

Я рекомендую вам использовать библиотеку панд:

Считайте ваши данные в информационный кадр, используя функция pandas.read_csv.
Передав аргумент names, вы можете загрузить только те столбцы CSV, которые вы хотите

import pandas as pd

df = pd.read_csv('results_file.csv', names=['student_id', 'subject', 'marks'])
0
Victor Ruiz 7 Июл 2019 в 08:35