当前位置:首页>python>【Python实战】用一段代码搞定“中考志愿录取分配”(附完整源码)

【Python实战】用一段代码搞定“中考志愿录取分配”(附完整源码)

  • 2026-09-10 00:53:00
【Python实战】用一段代码搞定“中考志愿录取分配”(附完整源码)

大家好,今天分享一个非常实用的案例: 👉 如何用 Python + Pandas 实现一个“志愿填报录取系统”,并自动生成最终录取结果表(Excel版)

这个案例非常适合:

  • 数据分析初学者
  • 教务系统/管理系统开发者
  • 想做实际项目练手的人

一、需求

 Excel 数据如下:

姓名
总成绩
第一志愿
第二志愿
第三志愿

以及对应的学校录取分数线:

  • 第二中学:560
  • 国语学校:530
  • 第一中学:517
  • 第四中学:500(补录/二批)
  • 第三中学:460

📌 目标: 实现一个“模拟录取系统”: 

1️⃣ 按志愿顺序录取(1→2→3)

 2️⃣ 满足分数线才录取 

3️⃣ 最终按学校输出录取名单(Excel表格)


二、核心思路

整个流程可以拆成 4 步:

① 读取 Excel 数据

df = pd.read_excel("20260321data.xlsx")

② 定义分数线规则

score_line = {"第二中学": 560,"国语学校": 530,"第一中学": 517,"第四中学": 500,"第三中学": 460}

👉 这里有个关键点: “第二中学”存在两个批次(560 / 500)

所以我们用:

  • 第二中学(主录取)
  • 第四中学(模拟补录)

来区分批次逻辑(非常关键🔥)


③ 核心录取算法(重点)

defadmit(row):    score = row["总成绩"]# 第一志愿优先if score >= 560and row["第一志愿"] == "第二中学":return"第二中学"if score >= 530and row["第一志愿"] == "国语学校":return"国语学校"if score >= 517and row["第一志愿"] == "第一中学":return"第一中学"if score >= 460and row["第一志愿"] == "第三中学":return"第三中学"# 第二志愿if score >= 530and row["第二志愿"] == "国语学校":return"国语学校"if score >= 517and row["第二志愿"] == "第一中学":return"第一中学"if score >= 500and row["第二志愿"] == "第二中学":return"第四中学"if score >= 460and row["第二志愿"] == "第三中学":return"第三中学"# 第三志愿if score >= 500and row["第三志愿"] == "第二中学":return"第四中学"if score >= 460and row["第三志愿"] == "第三中学":return"第三中学"return"未录取"

🔥 这段代码的本质

👉 模拟现实录取规则:

  • 优先第一志愿
  • 不满足 → 看第二志愿
  • 再不满足 → 看第三志愿
  • 全部不满足 → 未录取

④ 批量计算录取结果

df["录取学校"] = df.apply(admit, axis=1)

三、生成最终录取表(核心亮点🔥)

目标效果:

第二中学
国语学校
第一中学
第四中学
第三中学
张三
李四
王五
赵六
…

实现全部源代码:

import pandas as pd# =============================# 1. 读取 Excel# =============================df = pd.read_excel("20260321data.xlsx")# =============================# 2. 分数线# =============================score_line = {"第二中学": 560,"国语学校": 530,"第一中学": 517,"第四中学": 500,  # 关键:区分两个第二中学"第三中学": 460}# =============================# 3. 录取逻辑(关键🔥)# =============================defadmit(row):    score = row["总成绩"]# 第一志愿if score >= 560and row["第一志愿"] == "第二中学":return"第二中学"if score >= 530and row["第一志愿"] == "国语学校":return"国语学校"if score >= 517and row["第一志愿"] == "第一中学":return"第一中学"if score >= 460and row["第一志愿"] == "第三中学":return"第三中学"# 第二志愿if score >= 530and row["第二志愿"] == "国语学校":return"国语学校"if score >= 517and row["第二志愿"] == "第一中学":return"第一中学"if score >= 500and row["第二志愿"] == "第二中学":return"第四中学"if score >= 460and row["第二志愿"] == "第三中学":return"第三中学"# 第三志愿if score >= 500and row["第三志愿"] == "第二中学":return"第四中学"if score >= 460and row["第三志愿"] == "第三中学":return"第三中学"return"未录取"df["录取学校"] = df.apply(admit, axis=1)# =============================# 4. 分组(核心🔥)# =============================result = df[df["录取学校"] != "未录取"]grouped = result.groupby("录取学校")["姓名"].apply(list)# =============================# 5. 转成“表格结构”# =============================final_df = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in grouped.items()]))# =============================# 6. 输出# =============================print(final_df)# 保存Excelfinal_df.to_excel("最终录取结果.xlsx", index=False)

📌 关键技巧解析

✅ groupby + list

groupby("录取学校")["姓名"].apply(list)

👉 按学校聚合学生名单


✅ Series 转 DataFrame

pd.DataFrame(dict([(k, pd.Series(v)) for k, v in grouped.items()]))

👉 解决“每列长度不同”的问题(非常经典技巧)


四、导出 Excel

final_df.to_excel("最终录取结果.xlsx", index=False)

✔ 一键生成最终结果表

 ✔ 可直接交付使用


五、最终效果

你会得到一个非常清晰的录取结果:

  • 每列一个学校
  • 每行一个学生
  • 自动对齐
  • 可直接用于统计/汇报

这个案例你学到了:

✅ Pandas读取Excel ✅ apply实现复杂业务逻辑 ✅ groupby做数据聚合 ✅ DataFrame结构转换技巧

👉 本质能力:用代码还原真实业务规则


🎯 最后一句

很多人学 Python 卡在“不会做项目”, 其实像这种👇才是真正的实战:

👉 把现实规则 → 写成代码 → 自动化执行

获取和交流

需要本章或其他文章的源码和数据的同学,关注+三连,在对应文章下评论“6666“,加下面微信,发你!也可以拉你进群交流学习,加群备注:IT小本本学习

为了能随时获取最新动态,大家可以动动小手将公众号添加到“星标⭐”哦,点赞 + 关注,用时不迷路!!!!

关注公众号:IT小本本 👇

最新文章

随机文章