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,确保每个学校+成绩段的学生在不同班级间分布均衡。
相关推荐
用户83562907805114 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户83562907805114 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生1 天前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师1 天前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码1 天前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf1 天前
FastAPI 如何连接 MySQL
后端·python
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780512 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent2 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6252 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python