Python 实现对Excel 文件的统计与处理

以下是根据 学生所在初中学校成绩段 进行均衡分班的 Python 代码。目标是让每个班级的学生在成绩分布和学校来源上尽量均衡。


输入文件示例 (students.xlsx)

学生姓名 初中学校 成绩
张三 学校A 85
李四 学校B 92
王五 学校A 78
... ... ...

代码实现

python 复制代码
import pandas as pd
import numpy as np

def balanced_class_assignment(input_file, output_file, num_classes=3, score_bins=[60, 75, 90, 100]):
    """
    按初中学校和成绩段均衡分班
    :param input_file: 输入Excel文件路径
    :param output_file: 输出Excel文件路径
    :param num_classes: 班级数量(默认3个班)
    :param score_bins: 成绩分段区间(默认[60,75,90,100])
    """
    try:
        # 读取数据并添加'成绩段'列
        df = pd.read_excel(input_file)
        df['成绩段'] = pd.cut(df['成绩'], bins=score_bins, labels=[f"{score_bins[i]}-{score_bins[i+1]}" for i in range(len(score_bins)-1)])
        
        # 按学校和成绩段分组
        grouped = df.groupby(['初中学校', '成绩段'])
        
        # 分配班级:每组内轮流分配学生到不同班级
        df['班级'] = np.nan
        for (school, score_range), group in grouped:
            students = group.sample(frac=1).reset_index(drop=True)  # 随机打乱顺序
            class_labels = np.tile(np.arange(1, num_classes+1), len(students) // num_classes + 1)[:len(students)]
            df.loc[students.index, '班级'] = class_labels
        
        # 处理剩余未分配的学生(极少数情况)
        df['班级'] = df['班级'].fillna(method='ffill').astype(int)
        
        # 输出分班结果到Excel
        with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
            # 按班级写入不同Sheet
            for class_num in range(1, num_classes+1):
                class_df = df[df['班级'] == class_num]
                class_df.to_excel(writer, sheet_name=f'班级{class_num}', index=False)
            
            # 汇总统计表
            stats = df.pivot_table(
                index=['初中学校', '成绩段'],
                columns='班级',
                values='学生姓名',
                aggfunc='count',
                fill_value=0
            )
            stats.to_excel(writer, sheet_name='分班统计')
        
        print(f"分班完成!结果已保存至: {output_file}")

    except Exception as e:
        print(f"处理失败: {str(e)}")

# 使用示例
if __name__ == "__main__":
    balanced_class_assignment(
        input_file="students.xlsx",
        output_file="分班结果.xlsx",
        num_classes=3,
        score_bins=[60, 75, 90, 100]  # 自定义成绩段
    )

输出文件说明

  1. 分班结果.xlsx 包含:
    • 班级1、班级2、班级3:每个班级的学生名单。
    • 分班统计:各初中学校+成绩段的学生在班级间的分布。
初中学校 成绩段 班级1 班级2 班级3
学校A 75-90 2 2 1
学校A 90-100 1 1 0
学校B 60-75 3 2 3

关键逻辑

  1. 成绩分段

    • 使用 pd.cut 将成绩划分为区间(例如 60-75, 75-90, 90-100)。
    • 可通过 score_bins 参数自定义分段。
  2. 分组均衡分配

    • 初中学校 + 成绩段 分组。
    • 每组内随机打乱学生顺序,然后循环分配学生到不同班级(例如:学生1→班1,学生2→班2,学生3→班3,学生4→班1)。
  3. 处理余数

    • 如果某组学生数不能被班级数整除,余数会被依次分配到前几个班级(例如:5个学生分3个班 → 2,2,1)。

使用建议

  1. 自定义参数

    python 复制代码
    balanced_class_assignment(
        input_file="你的数据.xlsx",
        output_file="自定义结果.xlsx",
        num_classes=4,  # 设置班级数量
        score_bins=[0, 70, 85, 100]  # 自定义成绩分段
    )
  2. 验证均衡性

    • 检查输出文件中的 分班统计 Sheet,确保每个学校+成绩段的学生在不同班级间分布均衡。
相关推荐
秋邱7 分钟前
智启未来:AGI 教育融合 × 跨平台联盟 × 个性化空间,重构教育 AI 新范式开篇:一场 “教育 ×AI” 的范式革命
人工智能·python·重构·推荐算法·agi
爱吃泡芙的小白白13 分钟前
vscode、anaconda、git、python配置安装(自用)
ide·git·vscode·python·anaconda·学习记录
谷隐凡二13 分钟前
Kubernetes主从架构简单解析:基于Python的模拟实现
python·架构·kubernetes
老歌老听老掉牙19 分钟前
Matplotlib Pyplot 数据可视化完全指南
python·信息可视化·matplotlib
Sunhen_Qiletian23 分钟前
《Python开发之语言基础》第六集:操作文件
前端·数据库·python
Python编程学习圈27 分钟前
Python真的要一统天下了?
python
Hacker_Oldv1 小时前
Python技能进阶:探索Selenium库,实现网页自动化测试与爬虫
自动化测试·软件测试·爬虫·python·selenium·职场和发展
天天爱吃肉82181 小时前
电机控制技术深度解析:从基础原理到前沿实战
python·嵌入式硬件·汽车
银河邮差2 小时前
python实战-用海外代理IP抓LinkedIn热门岗位数据
后端·python
第二只羽毛3 小时前
遵守robots协议的友好爬虫
大数据·爬虫·python·算法·网络爬虫