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,确保每个学校+成绩段的学生在不同班级间分布均衡。
相关推荐
老师好,我是刘同学1 小时前
Python执行命令并保存输出到文件
python
啵啵鱼爱吃小猫咪3 小时前
机械臂阻抗控制github项目-mujoco仿真
开发语言·人工智能·python·机器人
MaximusCoder3 小时前
等保测评命令——Centos Linux
linux·运维·经验分享·python·安全·centos
yunyun321233 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
m0_662577973 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
songyuc3 小时前
【PyTorch】感觉`CrossEntropyLoss`和`BCELoss`很类似,为什么它们接收labels的shape常常不一样呢?
人工智能·pytorch·python
ℳ๓₯㎕.空城旧梦3 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
浩子智控4 小时前
python程序打包的文件地址处理
开发语言·python·pyqt
Jackey_Song_Odd4 小时前
Part 1:Python语言核心 - 序列与容器
开发语言·windows·python
m0_662577974 小时前
Python迭代器(Iterator)揭秘:for循环背后的故事
jvm·数据库·python