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,确保每个学校+成绩段的学生在不同班级间分布均衡。
相关推荐
tkevinjd2 小时前
MiniCode 项目详解6:原项目控制系统的10个缺陷(已修复)
python·llm·agent
dNGUZ7UGj3 小时前
10分钟完成第一个Python小游戏
python·django
没有梦想的咸鱼185-1037-16633 小时前
AI-Python机器学习与深度学习技术:CNN/Transformer/扩散模型、SHAP可解释及Hermes智能体自动化
人工智能·python·深度学习·机器学习·chatgpt·cnn·transformer
霸道流氓气质4 小时前
SpringBoot中通用工具类库(Utils)封装与使用实践
spring boot·后端·python
Draina5 小时前
CBC填充预言攻击-CBC Padding Oracle Crypto Attack
python·安全·web安全·网络安全·密码学·安全性测试
Angel Q.6 小时前
特征提取 | DINO 到 DINOv3
图像处理·python
不如语冰6 小时前
AI大模型入门-pytorch-张量2 tensor创建
python
NPE~6 小时前
[AI]Agent开发——ADK框架使用
人工智能·python·ai·教程·adk·agent开发
矮个史蒂芬6 小时前
统计verilog .v文件中output 的bit数
python
gwf2167 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件