python模拟高考录取

本文介绍了一种使用Python编程语言处理高考成绩、招生计划和志愿填报数据的方法,详细描述了如何根据特定的录取规则进行排序、投档,最终确定所有考生的录取情况并将结果保存为Excel文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数据说明:

考生分数.xlsx为某地区本科上线考生的高考成绩表。
招生计划.xlsx为全国高校在某地区的招生计划。
志愿填报表.xlsx为某地区考生的志愿填报情况。
其志愿内容表示某高校某专业,形如:1035:10。其中1035为学校代码,10为校内专业代码。
要求:
根据以上3表,确定所有考生的最终录取情况。
录取情况可能为:
某高校某专业,形如:1035:10。
当未被录取时,录取情况填“未录取”。

二、录取规则

对所有考生按照高考总分以及其他属性排序确定其唯一排名。
首先按总分排序,当总分相同时,按数学成绩排。
当数学相同时,按物理排。
当物理相同时,按化学排。
当化学相同时,按出生日期排,出生日期小的排名靠前。
若以上还相同,按考生编号排,考生编号小的排名靠前。
按照排名由前往后,对每个考生分别投档,投档时按照该考生的志愿1~志愿8的顺序投递。当目标专业人未录满时,投入目标专业,该考生录取完成。当目标专业人满时,考虑其下一个志愿。若该考生所有志愿用完时,仍未能投档,则该考生的录取状态为“未录取”。

三、python代码

1、读取数据

import pandas as pd
import numpy as np

# 读取数据
scores = pd.read_excel('考生分数.xlsx')
plans = pd.read_excel('招生计划.xlsx')
choices = pd.read_excel('志愿填报表.xlsx')

2、合并,生成x:y型

plans['学校代码']=plans['学校代码'].astype(str)
plans['校内专业代码']=plans['校内专业代码'].astype(str)
zhiyuan=plans['学校代码']+':'+plans['校内专业代码']
plans['专业']=zhiyuan
plans['专业']
0        1035:1
1        1035:2
2        1035:3
3        1035:4
4        1035:5
         ...   
6445    1362:35
6446    1362:36
6447    1362:37
6448    1362:38
6449    1362:39
Name: 专业, Length: 6450, dtype: object

3、将招生计划表转为字典


plans_dict = plans.set_index(['专业']).to_dict()['招生计划数']
plans_dict

4、排序

scores['总分'] = scores['语文'] + scores['数学'] + scores['英语'] + scores['物理'] + scores['化学']
scores = scores.sort_values(by=['总分', '数学', '物理', '化学', '出生日期', '考生编号'],
                            ascending=[False, False, False, False, True, True]).reset_index(drop=True)
scores
考生编号出生日期语文数学英语物理化学总分
0520202908022002-06-11148144145140149726
1520202120612002-02-17144149141144147725
2520203092522002-04-18143144150141147725
3520202854052001-10-07149137147145146724
4520202431432001-12-04147140150139147723
...........................
52756520202817342002-06-07999792104147539
52757520202901912001-09-279697101104141539
52758520202912032001-10-0699979699148539
52759520202875522002-04-08959699107142539
52760520202141602002-04-15999492107147539

52761 rows × 8 columns

5、合并scores,choices

df = pd.merge(scores,choices,on='考生编号')
df
考生编号出生日期语文数学英语物理化学总分志愿1志愿2志愿3志愿4志愿5志愿6志愿7志愿8
0520202908022002-06-111481441451401497261297:191262:21224:151127:28NaNNaNNaNNaN
1520202120612002-02-171441491411441477251180:231333:231047:121120:21083:111039:81050:71169:19
2520203092522002-04-181431441501411477251128:171350:51353:341245:61120:6NaNNaNNaN
3520202854052001-10-071491371471451467241220:211245:261069:81072:41224:91312:231334:7NaN
4520202431432001-12-041471401501391477231325:31297:131046:121130:11333:191322:11101:161153:27
...................................................
52756520202817342002-06-079997921041475391127:131080:11267:221196:211196:221052:161104:11132:2
52757520202901912001-09-2796971011041415391128:231155:21335:171196:251170:81075:231329:21343:1
52758520202912032001-10-06999796991485391085:41213:101335:91094:71291:61301:251222:151188:28
52759520202875522002-04-089596991071425391262:311353:211126:51306:111143:211282:51215:19NaN
52760520202141602002-04-159994921071475391323:271288:311094:201102:231102:311236:51215:1NaN

52761 rows × 16 columns

6、定义函数,关于投档和录取

def admission(df, plans_dict):
    # 定义投档状态和录取状态的字典
    admission_status = {}
    admission_result = {}
    
    # 遍历每个考生
    for i, row in df.iterrows():
        # 初始化投档状态,将每个志愿的投档状态全部置为False
        admission_status[row['考生编号']] = {j:False for j in range(1,9)}
        
        # 遍历每个志愿,找到可以投档的志愿
        for j in range(1,9):
            major = row[f'志愿{j}']
            if major in plans_dict and plans_dict[major] > 0 and not admission_status[row['考生编号']][j]:
                # 如果目标专业人未录满,则投入目标专业,修改招生计划数和考生的投档状态 
                plans_dict[major] -= 1
                admission_status[row['考生编号']][j] = True
                admission_result[row['考生编号']] = major
                break
            
            # 如果目标专业人已录满,继续找下一个志愿
            if j == 8:
                admission_result[row['考生编号']] = '未录取'
    
    return admission_result

admission_result = admission(df, plans_dict)
print(admission_result)  # 输出录取结果

7、将录取结果转换为数据框

result_df  =  pd.DataFrame.from_dict(admission_result,  orient='index',  columns=['录取专业']).sort_index()
result_df

录取专业
520202101041196:24
520202101101188:15
520202101121113:6
520202101131170:23
520202101151061:23
......
520203100961037:11
520203100971228:15
52020310099未录取
520203101021243:12
520203101031073:3

52761 rows × 1 columns

8、保存文件

#  将数据框保存为xlsx文件
result_df.to_excel('result.xlsx',  index_label='考生编号')



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值