新高考十二种选科情况下,再选科目的考室安排的探索2.0版

上一篇没有解决的几个问题和思考不全面的问题先总览一下:
1、一个总是报警的问题
2、一个总是有一行多的问题
3、没有把四科的安排合成一个表的问题
4、分离学生选的A科和非选A科的效率问题

import pandas as pd                    ##excel处理的模块
import random                          ##随机模块
import numpy as  np                    ##数组处理模块
# 这两个参数的默认设置都是False 中文行列名的对齐必备
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
#最大显××行,××列
pd.set_option('display.max_rows', 925)
pd.set_option('display.max_columns',6)#这里写  学生总体信息文件,本年级为 F:\操作区\考试学生座位安排\姓名-行政班级归属-教学班-采用志愿.xlsx
path1 = 'F:\操作区\考试学生座位安排\姓名-行政班级归属-教学班-采用志愿.xlsx'    #绝对路径
#  这个excel文件 必须要有的一些 列 :姓名 行政班归属    教学班 采用志愿     ps:后期加入  在籍  日语  音美书  体育
path3 = r'F:\操作区\考试学生座位安排\考场容量表.xlsx'
#  这个excel文件 必须要有的列: 容量
####上面为必要的 库  和中文显示设置
def get_df(path1):path11 = path1.split('\\')                           #相对本py文件所在文件夹的路径,当前为同文件夹try: data = pd.read_excel(path1)except:print('请把本py文件和数据源放在同一文件夹内,再次尝试。数据源的文件名为:姓名-行政班级归属-教学班-采用志愿.xlsx')data = pd.read_excel(path11[-1])return data#del data['Unnamed: 0']
#data.to_excel('F:\操作区\考试学生座位安排\姓名-行政班级归属-教学班-采用志愿.xlsx',index='')def getpath():print('请输入学生数据源文件路径,如:d:\××\××\文件名.xlsx')path = input()# 用空写个输入格式 判断 是否正确的 函数    return pathdef get_subject():print('请输入本次 需要按哪一科 安排考室')sub = ['化学','生物','政治','地理']sub1 = ['化','生','政','地']for i in range(len(sub)):print('\t[{}]{}'.format(i+1,sub[i]),end=' ')print('请输入数字 代表你的选择')path = sub1[int(input())-1]# 用空写个输入格式 判断 是否正确的 函数    return pathdef pickout():passdef getready(df1,sub1):          # df1 是一个数据表  ,sub表示科目:物化地,政史地  六科当中的一种name_sub1 = []xclass_sub1 = []for i in range(len(df1.采用志愿)):if sub1 in  df1.采用志愿[i] :name_sub1.append(df1.姓名[i])xclass_sub1.append(df1.行政班归属[i])df_sub1 = pd.DataFrame({'姓名':name_sub1,'行政班归属':xclass_sub1})print('这里是考室科目为:{} 的考生样表\n'.format(sub1),df_sub1[0:1])return df_sub1def getrest(df1,sub1):          # df1 是一个数据表  ,sub表示科目:物化地,政史地  六科当中的一种name_sub1 = []xclass_sub1 = []for i in range(len(df1.采用志愿)):if sub1 not in  df1.采用志愿[i] :name_sub1.append(df1.姓名[i])xclass_sub1.append(df1.行政班归属[i])df_sub1 = pd.DataFrame({'姓名':name_sub1,'行政班归属':xclass_sub1})print('这里是科目为:{} 的自习安排样表\n'.format(sub1),df_sub1[0:1])return df_sub1def get_rooms(path3):path33 = path3.split('\\')try:room = pd.read_excel(path3)except:print('绝对路径出错,尝试相对路径')room = pd.read_excel(path33[-1])print('这里是考室容量样表\n',room[0:1])return roomdef randomsort(room,temp_df):result_df = temp_df[0:1]##随机把  temp_df 按照一个序列排序sampler = np.random.permutation(len(temp_df)) #产生一个随机数列temp_df = temp_df.take(sampler)                 #DataFrame 采用 随机数列排序sumall =0for  i  in range(len(room.容量)):sumall = sumall + room.容量[i]kao_num = []if sumall <len(temp_df):for j in range(room.容量[i]):kaohao = sub1+str(i+1).rjust(2,'0')+str(j+1).rjust(2,'0')kao_num.append(kaohao)#??一次从temp_df中取出 room.容量[i] 行 作为第i个考室的考生print('{}第{}考室,共计{}人'.format(sub1,i+1,room.容量[i]),end=' ')room_df = temp_df[(sumall-room.容量[i]):sumall]room_df.insert(2,'考号',kao_num)    #kao_num要和考室人数一致即 room.容量[i]#path_save = '{}第{}考室'.format(sub1,i+1)+'.xlsx'#room_df.to_excel(path_save,index='')result_df = pd.concat([result_df, room_df])print('||',end=' ')else:#temp_df的最后几个 作为 第 i个考室的考生for j in range(len(temp_df)-(sumall-room.容量[i])):kaohao = sub1+str(i+1).rjust(2,'0')+str(j+1).rjust(2,'0')kao_num.append(kaohao)print('{}第{}考室,共计{}人'.format(sub1,i+1,len(temp_df)-(sumall-room.容量[i])),end=' ')room_df =   temp_df[(sumall-room.容量[i]):len(temp_df)]room_df.insert(2,'考号',kao_num)  #kao_num要和考室人数一致即 room.容量[i]#path_save = '{}第{}考室'.format(sub1,i+1)+'.xlsx'#room_df.to_excel(path_save,index='')   ,join_axes=[df5.index]result_df = pd.concat([result_df, room_df])print('||',end=' ')break #result_df.drop(labels=0,inplace=True)return result_df,i+1,kao_num[-1]def restsort(room,temp_df,used,last):result_df = temp_df[0:1]##随机把  temp_df 按照一个序列排序sumall =0for  i  in range(used,len(room.容量)):sumall = sumall + room.容量[i]kao_num = []if sumall <len(temp_df):for j in range(room.容量[i]):kaohao = sub1+str(i+1).rjust(2,'0')+str(j+1).rjust(2,'0')kao_num.append(kaohao)#??一次从temp_df中取出 room.容量[i] 行 作为第i个考室的考生print('{}第{}考室,共计{}人'.format(sub1,i+1,room.容量[i]),end=' ')room_df = temp_df[(sumall-room.容量[i]):sumall]room_df.insert(2,'考号',kao_num)    #kao_num要和考室人数一致即 room.容量[i]#path_save = '{}第{}考室'.format(sub1,i+1)+'.xlsx'#room_df.to_excel(path_save,index='')result_df = pd.concat([result_df, room_df])print('||',end=' ')else:#temp_df的最后几个 作为 第 i个考室的考生for j in range(len(temp_df)-(sumall-room.容量[i])):kaohao = sub1+str(i+1).rjust(2,'0')+str(j+1).rjust(2,'0')kao_num.append(kaohao)print('{}第{}考室,共计{}人'.format(sub1,i+1,len(temp_df)-(sumall-room.容量[i])),end=' ')room_df =   temp_df[(sumall-room.容量[i]):len(temp_df)]room_df.insert(2,'考号',kao_num)    #kao_num要和考室人数一致即 room.容量[i]     【*】#path_save = '{}第{}考室'.format(sub1,i+1)+'.xlsx'#room_df.to_excel(path_save,index='')   ,join_axes=[df5.index]result_df = pd.concat([result_df, room_df])print('||',end=' ')break #result_df.drop(labels=0,inplace=True)return result_dfdef showmenu():print('=+='*20)print('=欢迎使用 四选二 科目 考室随机安排系统=')print('=当前数据源为:{}'.format(path1))print('=当前考室容量源为:{}'.format(path3))print('=+='*20)df1 = get_df(path1)
room = get_rooms(path3)#sub1 = get_subject()
subs = ['化','生','政','地']path = []
for ii in range(len(subs)):sub1 = subs[ii]df1_sub1 = getready(df1,sub1)rest_df = getrest(df1,sub1)rest_df.sort_values('行政班归属',inplace=True)result_df1 ,used ,last = randomsort(room,df1_sub1)  # 返回一个具体安排df,用过的考室,最后的考号result_df2 = restsort(room,rest_df,used,last)result_df1 = pd.concat([result_df1,result_df2])result_df1.to_excel('{}考室安排.xlsx'.format(sub1),index='')path.append('{}考室安排.xlsx'.format(sub1))print('{}考室安排.xlsx'.format(sub1))print('four subs has done!')df1 = pd.read_excel(path[0])
for i in range(1,len(path)):df1 = pd.concat([df1,pd.read_excel(path[i])])df1.to_excel('高二年级考室安排.xlsx',index='')print('高二年级考室安排.xlsx  has done!')

第一个报警问题的解决及引起的另一种筛选思考
首先不得不说 思考问题的感受是痛苦和快乐的,在解决报警问题的时候,把报警信息A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value instead 往百度里一在这里插入代码片贴,满版的英文里好不容易发现有一篇中文,仔细一看 全是中文站点,原来是自己懒,输入的关键字E文太多,好尴尬。找了好几个,都提到了解决把法,用df.insert()来处理,我就改进了这段room_df[‘考号’] = kao_num 变为 room_df.insert(2,‘考号’,kao_num) 【*】处的标记 共四处
这篇文章推荐使用.loc
用.loc来操作单元格的值不会报错。此处我可以整列的操作,何必单个单元格操作。在知乎上找到.loc的一种搭配用法,从而找到解决问题4的 好办法。loc搭配 isin 如: df1 = df.loc[df[‘采用志愿’].isin(sub1)] 其中 sub1是一个列表 。所有的选科对应的列表这回复杂一点,但是少循环一次大表。
#选科有物理
sub1 = [‘物理’,‘物化生’,‘物化地’,‘物化政’,‘物生政’,‘物生地’,‘物政地’]
#选科有历史
sub2 = [‘历史’,‘化生史’,‘化地史’,‘化政史’,‘生政史’,‘生地史’,‘政史地’]
#选科有化学
sub3 = [‘化学’,‘物化生’,‘物化地’,‘物化政’,‘化生史’,‘化史地’,‘化政史’]
#选科有生物
sub4 = [‘生物’,‘物化生’,‘物生地’,‘物生政’,‘化生史’,‘生史地’,‘生政史’]
#选科有政治
sub5 = [‘政治’,‘物化政’,‘物生政’,‘物政地’,‘化史政’,‘生史政’,‘政史地’]
#选科有地理
sub6 = [‘地理’,‘物化地’,‘物生地’,‘物政地’,‘化史地’,‘生史地’,‘政史地’]

在使用这个df1 = df.loc[df[‘采用志愿’].isin(subs[i])]的过程中把isin里的参数删除就获得了空表。。。结构和后面要用的是一致,问题2就这么别解决了,很意外。

import pandas as pd
import random
import numpy as  np
# 这两个参数的默认设置都是False 中文行列名的对齐必备
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
#最大显××行,××列
pd.set_option('display.max_rows', 925)
pd.set_option('display.max_columns',6)path1 = 'F:\操作区\考试学生座位安排\姓名-行政班级归属-教学班-采用志愿.xlsx'
path2 = path1.split('\\')[-1]
path3 = 'F:\操作区\考试学生座位安排\考场容量表.xlsx'def get_df(path1):path11 = path1.split('\\')                           #相对本py文件所在文件夹的路径,当前为同文件夹try: data = pd.read_excel(path1)except:print('请把本py文件和数据源放在同一文件夹内,再次尝试。数据源的文件名为:姓名-行政班级归属-教学班-采用志愿.xlsx')data = pd.read_excel(path11[-1])return data#选科有物理
sub0 = ['物理','物化生','物化地','物化政','物生政','物生地','物政地']
#选科有历史
sub1 = ['历史','化生史','化史地','化政史','生政史','生史地','政史地']
#选科有化学
sub2 = ['化学','物化生','物化地','物化政','化生史','化史地','化政史']
#选科有生物
sub3 = ['生物','物化生','物生地','物生政','化生史','生史地','生政史']
#选科有政治
sub4 = ['政治','物化政','物生政','物政地','化政史','生政史','政史地']
#选科有地理
sub5 = ['地理','物化地','物生地','物政地','化史地','生史地','政史地']
subs= [sub0,sub1,sub2,sub3,sub4,sub5]#选科没有物理
sub00 = ['物理','化生史','化史地','化政史','生政史','生史地','政史地']
#选科没有历史
sub11 = ['历史','物化生','物化地','物化政','物生政','物生地','物政地']
#选科没有化学
sub22 = ['化学','生政史','生史地','政史地','物生政','物生地','物政地']
#选科没有生物
sub33 = ['生物','化史地','化政史','政史地','物化地','物化政','物政地']
#选科没有政治
sub44 = ['政治','化生史','化史地','生史地','物化生','物化地','物生地']
#选科没有地理
sub55 = ['地理','化生史','化政史','生政史','物化生','物化政','物生政']
subss= [sub00,sub11,sub22,sub33,sub44,sub55]#print(df1)
#print(sub1[0],len(df1))
def randomsort(room,temp_df,sub1):   #返回安排表:result_df  用完的考室:i+1  编排的最后一个考号:kao_num[-1]result_df = temp_df.loc[df['采用志愿'].isin([])]##随机把  temp_df 按照一个序列排序sampler = np.random.permutation(len(temp_df)) #产生一个随机数列temp_df = temp_df.take(sampler)                 #DataFrame 采用 随机数列排序sumall =0for  i  in range(len(room.容量)):sumall = sumall + room.容量[i]kao_num = []if sumall <len(temp_df):for j in range(room.容量[i]):kaohao = sub1+str(i+1).rjust(2,'0')+str(j+1).rjust(2,'0')kao_num.append(kaohao)#??一次从temp_df中取出 room.容量[i] 行 作为第i个考室的考生print('{}第{}考室,共计{}人'.format(sub1,i+1,room.容量[i]),end=' ')room_df = temp_df[(sumall-room.容量[i]):sumall]room_df.insert(4,'考号', kao_num)    ##room_df['考号'] = kao_num    #kao_num要和考室人数一致即 room.容量[i]#path_save = '{}第{}考室'.format(sub1,i+1)+'.xlsx'#room_df.to_excel(path_save,index='')result_df = pd.concat([result_df, room_df])print('||',end=' ')else:#temp_df的最后几个 作为 第 i个考室的考生for j in range(len(temp_df)-(sumall-room.容量[i])):kaohao = sub1+str(i+1).rjust(2,'0')+str(j+1).rjust(2,'0')kao_num.append(kaohao)print('{}第{}考室,共计{}人'.format(sub1,i+1,len(temp_df)-(sumall-room.容量[i])),end=' ')room_df =   temp_df[(sumall-room.容量[i]):len(temp_df)]room_df.insert(4,'考号', kao_num)result_df = pd.concat([result_df, room_df])print('||',end=' ')break #result_df.drop(labels=0,inplace=True)return result_df,i+1,kao_num[-1]def restsort(room,temp_df,sub1,used,last):result_df = temp_df.loc[df['采用志愿'].isin([])]##把temp_df按照行政班归属排序temp_df = temp_df.sort_values('行政班归属')sumall =0for  i  in range(used,len(room.容量)):sumall = sumall + room.容量[i]kao_num = []if sumall <len(temp_df):for j in range(room.容量[i]):kaohao = sub1[0]+str(i+1).rjust(2,'0')+str(j+1).rjust(2,'0')kao_num.append(kaohao)#??一次从temp_df中取出 room.容量[i] 行 作为第i个考室的考生print('{}第{}考室,共计{}人'.format(sub1,i+1,room.容量[i]),end=' ')room_df = temp_df[(sumall-room.容量[i]):sumall]room_df.insert(4,'考号',kao_num)    #kao_num要和考室人数一致即 room.容量[i]result_df = pd.concat([result_df, room_df])print('||',end=' ')else:#temp_df的最后几个 作为 第 i个考室的考生for j in range(len(temp_df)-(sumall-room.容量[i])):kaohao = sub1[0]+str(i+1).rjust(2,'0')+str(j+1).rjust(2,'0')kao_num.append(kaohao)print('{}第{}考室,共计{}人'.format(sub1,i+1,len(temp_df)-(sumall-room.容量[i])),end=' ')room_df =   temp_df[(sumall-room.容量[i]):len(temp_df)]room_df.insert(4,'考号',kao_num)    #kao_num要和考室人数一致即 room.容量[i]result_df = pd.concat([result_df, room_df])print('||',end=' ')break #result_df.drop(labels=0,inplace=True)return result_df
#化生政地四科安排
used = []   #每科使用的考试座位号,自习座位号断点
df = get_df(path1)
room = get_df(path3)
finall_df = df.loc[df['采用志愿'].isin([''])]
for i in range(2,len(subs)):df1 = df.loc[df['采用志愿'].isin(subs[i])]df11 = df.loc[df['采用志愿'].isin(subss[i])]result_df ,used_i,used_kao = randomsort(room,df1,subs[i][0])rest_df = restsort(room,df11,subs[i][0],used_i,used_kao)result_df = pd.concat([result_df, rest_df])temp_used = [used_i,used_kao]used.append(temp_used)print('='*88)print(result_df,subs[i][0],len(result_df),used_i,used_kao)finall_df = pd.concat([result_df,finall_df])finall_df.to_excel('高二年级考试安排.xlsx',index='')

新高考十二种选科情况下,再选科目的考室安排的探索2.0版相关推荐

  1. 北京化工大学计算机科专业,北京化工大学新高考选科要求-北京化工大学选科对应专业...

    选择科目 测一测我能上哪些大学 选择科目 领取你的专属报告 > 选择省份 关闭 请选择科目 确定 v> 北京化工大学创办于1958年,时名北京化工学院,1994年更名为北京化工大学.学校是 ...

  2. 读史鉴今:女人的十二种结局

    女人的十二种结局 案例一:不过如此 祝英台,东晋时上虞乡富家女,女扮男装去杭州求学.路遇梁山伯,两人一见如故,携手作伴,在书院同居同宿,结下深厚情谊. 三年后,祝父催其归家,在送行路上,祝英台百般暗示 ...

  3. 薛斯通道的十二种买入法和四种卖出法

    薛斯通道包括两组通道指标,分别是长期大通道指标和短期小通道指标.股价实际上是被短期小通道包容着在长期大通道中上下运行.薛斯通道的大.小通道总共有四条轨道线:       内上轨(黄色线或紫色线)代表短 ...

  4. 作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

    首先呢?我是一名程序员,经常性和同事没话题. 因为每天都会有自己的任务要做,程序员对于其他行业来说:是相对来说比较忙的.你会经常看到程序员在发呆.调试密密麻麻代码.红色报错发呆: 这时你千万不要去打扰 ...

  5. 关于Authorware的十二种使用技巧

    Authorware是美国Macromedia公司(现已被adobe公司收购)开发的一种多媒体制作软件,它是一个图标导向式的多媒体开发工具.今天我们学习一下Authorware的十二种使用技巧,如果你 ...

  6. 二十三种设计模式(第十二种)-----代理模式(Proxy)

    二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...

  7. 当下中国的十二种孤独

    科技每天都在更新,各种数码设备每天都在陪伴着我们,填补了原本空虚.无聊.发呆的时间,甚至侵占了原本应该用来工作.交谈.睡觉的时间.网游里有最性感的虚拟女友,微博可以引来数万人关注,视频网站的电视剧不插 ...

  8. 网上流传的《名侦探柯南》大结局十二种!

    网上流传的<名侦探柯南>大结局十二种! 以下结局 纯属虚构 如有雷同 勿扔鸡蛋 (一)柯南终于打败黑暗组织并找到恢复身体的方法,与小兰共结连理.后来两人有了爱情的结晶--一个男孩,取名为工 ...

  9. 计算机中十二种常用密码的破解方法(转)

    计算机中十二种常用密码的破解方法(转)[@more@] 在日常操作中,我们经常要输入各种各样的密码,例如开机时要输入密码,QQ时也要先输入密码,假如你忘记了这些密码,就有可能用不了机器.打不开文件.不 ...

  10. gcms基峰有什么用_GC-MS十二种个常见问题和解决办法

    GC-MS十二种个常见问题和解决办法 浏览次数:9662发布日期:2017-03-28 1 样品进样一段时间后,突然进样口中压力不上不去了,这是为什么呢? 其实主要是因为我们进样次数过多,导致隔垫密封 ...

最新文章

  1. 平面分治详解 超级详细(附带例题 最近点对问题(给了题目))(UVA10245,P1257,P1429)
  2. 不插电的计算机科学读心术,科学“读心术”,当脑电波扫描图遇到人工智能
  3. node_modules
  4. Java中return结束循环,Java中break、continue、return在for循环中的使用
  5. 非洲瓜哇JAVA布的特点_java语言的基本特性以及编程细节
  6. android导航屏幕,发现具有软件导航栏的Android设备的真实屏幕尺寸(以像素为单位)...
  7. 海康工业相机的一些坑(USB接口的相机连上halcon17后,客户端无法打开相机,错误是无驱动,但是驱动是好好的,如何解决)
  8. 七月算法机器学习1 相关数学基础
  9. 半小时实现Java手撸网络爬虫框架!!(附完整源码,建议收藏)
  10. 囧。。。不知不觉破解了IDMan。。。木有注意最后一步咋破的。。。
  11. 【PCB学习笔记】绘制智能车四层板 --- DRC检查,拼版设计及资料输出
  12. win7 开始 计算机箭头,Windows7美化教程:Win7快捷方式箭头怎么去掉
  13. 2019腾讯广告算法大赛题目理解与数据探索(含代码)
  14. poi-tl 循环表格合并重复项
  15. MediaType介绍
  16. Metasploit [基础]
  17. 修練營ASP.NET]淺談多層式架構 (Multi Tiers)
  18. 进入网络安全学习的感想
  19. 语音信号处理-基础(二): 发声生理、听觉生理与听觉心理
  20. UG\NX二次开发 获取曲线上某个位置的点坐标、切线矢量、主法线矢量、副法线矢量 UF_MODL_ask_curve_props

热门文章

  1. 街霸5 android,街头霸王5手机版
  2. scikit-learn 线性回归算法
  3. 慕课java工程师2020版_中国大学慕课2020Java程序设计答案大全
  4. android flurry 教程,Flurry没有集成到Android应用中
  5. bing壁纸获取(Java)
  6. VMware安装失败 找不到msi文件
  7. 减法公式运算法则_六年级数学各种运算法则与学习方法
  8. 学习自旋电子学的笔记04:模拟自旋波在弯曲磁畴壁中传播
  9. 用 IntelliJ IDEA来创建的java web工程,工程的子模块右下角没有蓝色小方块的解决办法
  10. 第3章第32节:图形的应用:使用图形表达并列关系的内容 [PowerPoint精美幻灯片实战教程]