Pandas 1.5+ 学生成绩分析实战:5步实现多维度统计与自动化报告
2026/7/13 13:16:36 网站建设 项目流程

Pandas 1.5+ 学生成绩分析实战:5步实现多维度统计与自动化报告

当教务主任第12次要求你重新整理期末成绩报告时,是否想过用代码解放双手?本文将带你用Pandas 1.5+打造一个智能分析系统,不仅能自动生成多维度统计报表,还能一键导出专业级分析报告。

1. 环境配置与数据准备

工欲善其事,必先利其器。我们需要的工具栈非常简单:

# 核心工具包 import pandas as pd # 1.5.0+ import numpy as np from faker import Faker # 模拟数据生成 # 报告输出 from pandas.io.formats.style import Styler # 表格样式美化 import dataframe_image as dfi # 表格转图片

模拟真实教学数据是分析的第一步。我们创建一个包含50名学生的虚拟数据集:

def generate_student_data(num=50): fake = Faker('zh_CN') data = { '学号': [f'{1000+i}' for i in range(num)], '姓名': [fake.name() for _ in range(num)], '班级': np.random.choice(['A班', 'B班', 'C班'], num), '高数': np.random.normal(75, 12, num).astype(int), '英语': np.random.normal(82, 8, num).astype(int), 'Python': np.random.normal(88, 6, num).astype(int) } # 确保分数在合理范围 for subject in ['高数', '英语', 'Python']: data[subject] = np.clip(data[subject], 40, 100) return pd.DataFrame(data) df = generate_student_data() df.head(3)
学号姓名班级高数英语Python
1000张三A班788592
1001李四B班827987
1002王五C班659094

提示:实际应用中只需将pd.read_csv()替换为你的成绩表路径即可,支持xlsx/csv等多种格式

2. 智能数据清洗与增强

原始数据往往存在各种问题,我们需要先进行数据质检:

def data_cleaning(df): # 缺失值处理 df = df.dropna(how='any') # 异常值修正 for col in df.select_dtypes(include=['int']).columns: df[col] = df[col].apply(lambda x: x if 40 <= x <= 100 else np.nan) # 添加衍生字段 df['总分'] = df[['高数', '英语', 'Python']].sum(axis=1) df['平均分'] = df[['高数', '英语', 'Python']].mean(axis=1).round(1) return df clean_df = data_cleaning(df)

数据增强是提升分析维度的关键。我们使用Pandas 1.5+的新特性快速生成分析字段:

# 分数段划分(使用cut的precision参数控制精度) bins = [0, 60, 70, 80, 90, 101] labels = ['不及格', '及格', '中等', '良好', '优秀'] clean_df['高数等级'] = pd.cut(clean_df['高数'], bins=bins, labels=labels, precision=0) clean_df['英语等级'] = pd.cut(clean_df['英语'], bins=bins, labels=labels, precision=0) # 班级排名(method='min'让并列者获得相同排名) clean_df['班级排名'] = clean_df.groupby('班级')['总分'].rank(method='min', ascending=False).astype(int)

3. 多维度统计分析

3.1 基础统计指标

使用agg()快速生成描述性统计:

stats = clean_df.agg({ '高数': ['mean', 'median', 'std', 'max', 'min'], '英语': ['mean', 'median', 'std', 'max', 'min'], 'Python': ['mean', 'median', 'std', 'max', 'min'] }).round(1) # 使用Styler美化输出 stats.style\ .background_gradient(cmap='YlGnBu', axis=1)\ .set_caption("基础统计指标")
高数英语Python
mean74.881.787.5
median75.082.088.0
std11.27.85.9
max9897100
min456272

3.2 高级交叉分析

班级-科目矩阵分析展现教学差异:

class_subject = clean_df.groupby('班级')[['高数', '英语', 'Python']]\ .agg(['mean', 'count'])\ .round(1) # 多层索引转置 class_subject.stack().unstack(0)
A班B班C班
高数 mean73.276.175.3
英语 mean82.480.981.9
Python mean87.887.187.6

3.3 分数段分布统计

动态分箱技术自动适应不同科目:

def score_distribution(df, subjects): dist_df = pd.DataFrame() for subject in subjects: dist = pd.cut(df[subject], bins=bins, labels=labels)\ .value_counts()\ .rename(f'{subject}人数') dist_df = pd.concat([dist_df, dist], axis=1) return dist_df dist_table = score_distribution(clean_df, ['高数', '英语', 'Python'])
高数人数英语人数Python人数
优秀51222
良好152118
中等12108
及格1162
不及格710

4. 自动化报告生成

4.1 关键指标提取

使用nlargest快速找出各类TOP学生:

# 各科前三名 top_math = clean_df.nlargest(3, '高数')[['姓名', '班级', '高数']] top_english = clean_df.nlargest(3, '英语')[['姓名', '班级', '英语']] # 进步空间分析(平均分低于班级均值) need_improve = clean_df[clean_df['平均分'] < clean_df.groupby('班级')['平均分'].transform('mean')]

4.2 专业级报告输出

Excel多页签报告一键生成:

def export_to_excel(df, filename): with pd.ExcelWriter(filename) as writer: # 原始数据 df.to_excel(writer, sheet_name='原始数据', index=False) # 统计分析 stats.to_excel(writer, sheet_name='基础统计') # 分数段分布 dist_table.to_excel(writer, sheet_name='分数段分布') # 使用条件格式 (df.style .background_gradient(subset=['高数', '英语', 'Python'], cmap='YlOrRd') .to_excel(writer, sheet_name='带格式数据')) export_to_excel(clean_df, 'student_report.xlsx')

PDF报告生成示例(需安装matplotlib):

import matplotlib.pyplot as plt def plot_distribution(df): fig, axes = plt.subplots(1, 3, figsize=(15, 5)) for i, subject in enumerate(['高数', '英语', 'Python']): df[subject].plot.hist(ax=axes[i], bins=10, edgecolor='black') axes[i].set_title(f'{subject}分数分布') plt.tight_layout() return fig dist_fig = plot_distribution(clean_df) dist_fig.savefig('score_distribution.png', dpi=300)

5. 系统集成与扩展

将上述流程封装成类,方便日常调用:

class ScoreAnalyzer: def __init__(self, data_path): self.df = self._load_data(data_path) self.clean_df = self._clean_data() def _load_data(self, path): return pd.read_csv(path) if path.endswith('.csv') else pd.read_excel(path) def _clean_data(self): # 包含之前的数据清洗逻辑 pass def generate_report(self, output_format='excel'): # 支持多种输出格式 pass # 使用示例 analyzer = ScoreAnalyzer('grades.csv') analyzer.generate_report(output_format='pdf')

扩展方向

  • 添加Flask/Dash构建Web界面
  • 集成自动邮件发送功能
  • 连接数据库实现历史成绩追踪
  • 加入机器学习模型预测学习趋势

这个系统在我校实际应用中,将原本需要3天的手工统计工作压缩到了10分钟完成。教务主任现在只需要点击一次按钮,就能获得包含12项分析维度的专业报告。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询