任務描述:
在即將到來的運動會中有學院間男生的引體向上和女生的立定跳遠項目,現需要從所有的學生名單中從每個學院挑選男女各45個參加項目。(每次運行得到一個學院的結果)
實施方法:
利用pandas庫讀取excel,Dataframe的用法進行篩選得到所要抽簽學院的總的男生,總的女生。利用生成隨機數函數生成要選擇的行(第幾行被選中)。再把結果輸出到結果excel中。
具體代碼
因為男生女生一樣所以下面以選45個男生為例
import os
import pandas as pd
import random
from openpyxl import load_workbook
#讀入源文件,方便移植
path = os.getcwd()
name = '/orignal.xlsx'
data = pd.read_excel(path + name)
#根據輸入得到要抽簽學院的信息
col = input("請輸入要抽簽的學院:")
data = data[data["college"] == col]
data1 = data[data["sex"] == '男']
num = data.shape[0]#該學院的人數
res_num =2#抽簽的人數
#得到隨機行數
random.seed(20220409)#隨機種子,值相同得到的隨機數相同
res_list = random.sample(range(0, num), res_num) #得到隨機數列表,data下標從0開始
res_list.sort()#排序,使最后得到的相對有序,各個年級在一起
#利用Dataframe對象存儲被選中的人,
res = pd.DataFrame(columns=('num', 'name', 'sex', 'college'))
for i in res_list:
res = res.append(data.iloc[i])#追加函數將要廢棄
#temp = data.iloc[i]//可利用自建字典把Series對象轉換為DataFrame對象再concat合並
#t = {'num':[temp[0]], 'name':[temp[1]], 'sex':[temp[2]], 'college':[temp[3]]}
#tpd = pd.DataFrame(t)
#res = pd.concat([res, tpd])
res.index = range(len(res))#重新建立索引
res.index=res.index+1#索引從1開始
#利用book對象實現寫入到同一個表的不同sheet中
book = load_workbook('res.xlsx')
write = pd.ExcelWriter(r'res.xlsx', engine='openpyxl')
write.book = book
res.to_excel(write, sheet_name=col)
write.save()
write.close()
現存bugs
當結果excel不存在時報錯,不會創建文件。
感想
python以簡單著名,但對其中的知識仍然需要系統的進行整理。同時python也是最容易與生活相聯系的一門編程語言。