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,确保每个学校+成绩段的学生在不同班级间分布均衡。
相关推荐
不知名的老吴3 分钟前
线程的生命周期之线程“插队“
java·开发语言·python
xsc6996751 小时前
从零搭建大模型与智能体平台 - 完整技术详解
python
无风听海2 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
CTA终结者3 小时前
期货量化主力换月程序怎么移仓:天勤 underlying_symbol 与任务切换
python·区块链
马士兵教育3 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
KaMeidebaby3 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
Cloud_Shy6184 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
天佑木枫4 小时前
15天Python入门系列 · 序
开发语言·python
happylifetree4 小时前
Python017-第二章15.数据容器-dict常用操作
python
装不满的克莱因瓶4 小时前
了解 LangChain 中的 LLM 与 ChatModel 的差异
人工智能·python·ai·langchain·llm·agent·chatmodel