以下是根据 学生所在初中学校 和 成绩段 进行均衡分班的 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] # 自定义成绩段
)
输出文件说明
- 分班结果.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 |
关键逻辑
-
成绩分段:
- 使用
pd.cut
将成绩划分为区间(例如60-75
,75-90
,90-100
)。 - 可通过
score_bins
参数自定义分段。
- 使用
-
分组均衡分配:
- 按
初中学校
+成绩段
分组。 - 每组内随机打乱学生顺序,然后循环分配学生到不同班级(例如:学生1→班1,学生2→班2,学生3→班3,学生4→班1)。
- 按
-
处理余数:
- 如果某组学生数不能被班级数整除,余数会被依次分配到前几个班级(例如:5个学生分3个班 → 2,2,1)。
使用建议
-
自定义参数:
pythonbalanced_class_assignment( input_file="你的数据.xlsx", output_file="自定义结果.xlsx", num_classes=4, # 设置班级数量 score_bins=[0, 70, 85, 100] # 自定义成绩分段 )
-
验证均衡性:
- 检查输出文件中的 分班统计 Sheet,确保每个学校+成绩段的学生在不同班级间分布均衡。