python bighomework for help

给定一个成绩单CSV文件Grade.csv(见附件),存储格式为:每一行为学号、姓名、科目、该科目对应的成绩,各项以1个逗号分隔。

(1)计算每位同学的平均成绩,按照平均成绩降序排名,并写入csv文件(文件名:AvgGrade.csv)中,csv文件的格式为:每一行为学号、姓名、平均成绩、科目数、排名。

(2)根据平均成绩生成柱状图或饼形图,统计分析出60分以下、60-69分、70-79分、80-89、90分及以上各多少同学等。

给分点:

读CSV文件Grade.csv;
读入每一行,分析出该同学每一科的成绩,并选用合适的数据结构存放同学的学号、姓名及成绩;
统计出每位同学的平均成绩;
按平均成绩排名;
写csv文件AvgGrade.csv;
生成柱状图或饼形图。
csv文件链接
链接:https://pan.baidu.com/s/1dM7OBFgp6aCM3OK2lsGPvA?pwd=vndk
提取码:vndk

完成代码如下,望采纳

import pandas as pd

# 读取 Grade.csv 文件
df = pd.read_csv('Grade.csv')

# 将每位同学的每门课成绩放入一个字典中,字典的键为学号,值为一个字典,其中包含姓名和该同学所有课程的成绩
students = {}
for _, row in df.iterrows():
    student_id = row['学号']
    if student_id not in students:
        students[student_id] = {'姓名': row['姓名'], '成绩': []}
    students[student_id]['成绩'].append(row['成绩'])

# 计算每位同学的平均成绩
for student_id in students:
    student = students[student_id]
    student['平均成绩'] = sum(student['成绩']) / len(student['成绩'])

# 按平均成绩排名
sorted_students = sorted(students.values(), key=lambda x: x['平均成绩'], reverse=True)

# 写入 AvgGrade.csv 文件
with open('AvgGrade.csv', 'w') as f:
    f.write('学号,姓名,平均成绩,科目数,排名\n')
    for i, student in enumerate(sorted_students):
        f.write(f'{student_id},{student["姓名"]},{student["平均成绩"]},{len(student["成绩"])},{i+1}\n')

# 生成柱状图
# 这里假设已经使用 matplotlib 生成了图像

# 统计分析各个分数段的人数
num_60 = 0
num_70 = 0
num_80 = 0
num_90 = 0

for student in sorted_students:
    if student['平均成绩'] < 60:
        num_60 += 1
    elif student['平均成绩'] < 70:
        num_70 += 1
    elif student['平均成绩'] < 80:
        num_80 += 1
    else:
        num_90 += 1

# 打印结果
print(f'60分以下的人数: {num_60}')
print(f'60-69分的人数: {num_70}')
print(f'70-79分的人数: {num_80}')
print(f'80-89分的人数: {num_90}')

# 继续上面的代码

import matplotlib.pyplot as plt

# 生成饼图
labels = ['60分以下', '60-69分', '70-79分', '80-89分']
sizes = [num_60, num_70, num_80, num_90]

fig1, ax1 = plt.subplots()
ax1.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)
ax1.axis('equal')

plt.show()