用Python實(shí)現(xiàn)數(shù)據(jù)篩選與匹配實(shí)例
下面我們將學(xué)習(xí)兩個(gè)項(xiàng)目案例代碼,分別解決Excel常見(jiàn)場(chǎng)景中的數(shù)據(jù)篩選問(wèn)題和數(shù)據(jù)匹配問(wèn)題。
數(shù)據(jù)篩選要求我們?cè)诒碇泻Y選出符合條件的數(shù)據(jù)。
數(shù)據(jù)匹配需要我們?cè)诙鄠€(gè)表之間匹配相關(guān)的數(shù)據(jù)。
與之前一樣,完成項(xiàng)目問(wèn)題的代碼,需要我們先分析數(shù)據(jù)篩選和數(shù)據(jù)匹配的需求,再找到對(duì)應(yīng)知識(shí)點(diǎn),確定代碼的執(zhí)行順序,從而實(shí)現(xiàn)項(xiàng)目代碼。
案例一:數(shù)據(jù)篩選
這個(gè)案例需要我們篩選出遲到人員的信息,來(lái)具體看看。
在【10月考勤統(tǒng)計(jì).xlsx】工作簿中,保存了公司一百名員工的遲到信息,這些信息包含了遲到時(shí)間和遲到次數(shù)。

公司規(guī)定,遲到時(shí)間超過(guò)45分鐘且遲到過(guò)3次以上的員工記為考勤不合格,需要扣除300的考勤保證金。

之前的同事需要把篩選后的結(jié)果保存為【10月遲到人員信息.xlsx】,并將整理后的信息上報(bào)給領(lǐng)導(dǎo)。
那么如何用代碼實(shí)現(xiàn)這個(gè)場(chǎng)景呢?
在編寫(xiě)代碼之前,我們要先明確任務(wù)需求。
根據(jù)公司的規(guī)定,篩選出【10月考勤統(tǒng)計(jì).xlsx】中遲到時(shí)間大于45分鐘并且遲到次數(shù)超過(guò)3次以上的員工信息,將遲到人員信息打印出來(lái)后再存入新工作簿【10月遲到人員信息.xlsx】中。

代碼實(shí)現(xiàn):
from openpyxl import load_workbook, Workbook
# 打開(kāi)【10月考勤統(tǒng)計(jì).xlsx】工作簿
wb = load_workbook('./material/10月考勤統(tǒng)計(jì).xlsx')
# 獲取活動(dòng)工作表
ws = wb.active
print(ws)
print(ws[1])
print('----------------')
# 獲取表頭
late_header = []
for cell in ws[1]:
late_header.append(cell.value)
print(cell.value)
# 新建工作簿
new_wb = Workbook()
# 獲取新工作簿中的工作表
new_ws = new_wb.active
# 將表頭寫(xiě)入新工作簿的工作表中
new_ws.append(late_header)
# 從第二行開(kāi)始遍歷表格
for row in ws.iter_rows(min_row=2, values_only=True):
# 取出姓名,遲到時(shí)間和遲到次數(shù)
name = row[1]
time = row[3]
number = row[-1]
# 判斷是否遲到
if time > 45 and number > 3:
print('{}遲到了{(lán)}分鐘,遲到了{(lán)}次'.format(name, time, number))
# 將遲到人員信息寫(xiě)入新工作簿的工作表中
new_ws.append(row)
# 將新工作簿保存為【10月遲到人員信息.xlsx】
new_wb.save('./material/10月遲到人員信息.xlsx')運(yùn)行結(jié)果:




根據(jù)任務(wù)需求,我們需要獲取兩部分?jǐn)?shù)據(jù):表頭數(shù)據(jù)和表頭以外的所有數(shù)據(jù)。
你可能會(huì)比較疑惑,為什么要單獨(dú)獲取表頭數(shù)據(jù)呢?

由于任務(wù)需要我們生成新的工作簿【10月遲到人員信息.xlsx】,新工作簿中的表頭與【10月考勤統(tǒng)計(jì).xlsx】相同,所以我們需要獲取到表頭的數(shù)據(jù)以便后續(xù)使用。
使用數(shù)據(jù)
我們需要在這一步實(shí)現(xiàn)數(shù)據(jù)篩選功能,通過(guò)分析任務(wù)需求可以總結(jié)出三個(gè)篩選條件:
1)遲到時(shí)間大于45分鐘。
2)遲到次數(shù)大于3次。
3)同時(shí)滿足上面兩個(gè)條件。
明確了篩選條件后,就可以借助條件判斷語(yǔ)句,比較運(yùn)算符,成員運(yùn)算符和邏輯運(yùn)算符等Python基礎(chǔ)知識(shí),實(shí)現(xiàn)對(duì)于數(shù)據(jù)的篩選,即將上面得到的篩選條件用Python語(yǔ)言實(shí)現(xiàn)出來(lái)。

假設(shè)我們用time來(lái)代表遲到時(shí)間,用number代表遲到次數(shù),那么篩選條件就可以寫(xiě)為:if time > 45 and number > 3:
數(shù)據(jù)輸出
完成篩選后,我們需要根據(jù)實(shí)際需求將篩選結(jié)果輸出到終端,或?qū)⒑Y選結(jié)果保存起來(lái)。
本次任務(wù)要求我們將篩選后的員工信息打印出來(lái),并且存儲(chǔ)到【10月遲到人員信息.xlsx】中。
如果需要獲取工作簿中滿足某些條件的數(shù)據(jù),這種場(chǎng)景就可以被歸類(lèi)為數(shù)據(jù)篩選場(chǎng)景。
處理該場(chǎng)景時(shí),可以按照獲取數(shù)據(jù),使用數(shù)據(jù)和數(shù)據(jù)輸出這三個(gè)步驟來(lái)處理。
首先是獲取數(shù)據(jù),使用上節(jié)課學(xué)習(xí)過(guò)的表格讀寫(xiě)的相關(guān)知識(shí),根據(jù)任務(wù)需求,確定要獲取的是零散的單元格,是單行/單列,還是多行/多列的數(shù)據(jù)。
數(shù)據(jù)篩選的關(guān)鍵落在了篩選二字上,我們可以在使用數(shù)據(jù)這一步中實(shí)現(xiàn)篩選功能。
在這一步,要仔細(xì)理解任務(wù)需求,明確篩選條件,然后根據(jù)實(shí)際情況,選擇Python基礎(chǔ)語(yǔ)法的相關(guān)知識(shí)(條件判斷語(yǔ)句,比較運(yùn)算符,成員運(yùn)算符和邏輯運(yùn)算符),構(gòu)造篩選條件。

最后是數(shù)據(jù)輸出部分,根據(jù)實(shí)際需要輸出篩選結(jié)果,或?qū)⒑Y選結(jié)果保存起來(lái)。總結(jié)起來(lái)可以分為三類(lèi):
1)將篩選的結(jié)果存入學(xué)過(guò)的數(shù)據(jù)結(jié)構(gòu)里,比如:列表,元組或字典。
2)將篩選的結(jié)果存入文件中。
3)將篩選的結(jié)果打印出來(lái)。
案例二:數(shù)據(jù)匹配
這個(gè)案例需要我們匹配兩張表格中指定的遲到次數(shù),先來(lái)看看案例場(chǎng)景。
現(xiàn)有兩張表格,【10月考勤統(tǒng)計(jì).xlsx】中記錄了員工十月份的遲到次數(shù)數(shù)據(jù),這份表格是公司行政手動(dòng)記錄的。

【遲到次數(shù)月度統(tǒng)計(jì)(10月更新).xlsx】中按月記錄了員工每月的遲到次數(shù)數(shù)據(jù),這份表格是由公司的考勤系統(tǒng)自動(dòng)生成的。

兩份表格中的數(shù)據(jù)可以通過(guò)工號(hào)一一對(duì)應(yīng)。
現(xiàn)需要核對(duì)兩張表格中10月遲到次數(shù)是否匹配(即兩表中相同工號(hào)在十月份的遲到次數(shù)是否一致),并在終端提醒相關(guān)人員去核查不匹配的情況。

代碼實(shí)現(xiàn):
from openpyxl import load_workbook
# 打開(kāi)工作簿【10月考勤統(tǒng)計(jì).xlsx】,獲取活動(dòng)工作表
wb = load_workbook('./material/10月考勤統(tǒng)計(jì).xlsx')
ws = wb.active
# 創(chuàng)建遲到人員字典
info_dict = {}
# 循環(huán)讀取除表頭外的表格數(shù)據(jù)
for row in ws.iter_rows(min_row=2, values_only=True):
# 取出員工工號(hào)
staff_id = row[0]
# 取出遲到次數(shù)
staff_late = row[-1]
# 將信息添加入字典,字典格式為{'員工工號(hào)': '遲到次數(shù)'}
info_dict[staff_id] = staff_late
# 打開(kāi)工作簿【遲到次數(shù)月度統(tǒng)計(jì)(10月更新).xlsx】,獲取活動(dòng)工作表
monthly_wb = load_workbook('./material/遲到次數(shù)月度統(tǒng)計(jì)(10月更新).xlsx')
monthly_ws = monthly_wb.active
# 循環(huán)讀取出表頭外的表格數(shù)據(jù)
for monthly_row in monthly_ws.iter_rows(min_row=3, max_col=13, values_only=True):
# 取出員工工號(hào)
member_id = monthly_row[0]
# 取出十一月份的遲到次數(shù)
member_late = monthly_row[-1]
# 匹配遲到次數(shù)是否相等
if member_late != info_dict[member_id]:
print('工號(hào){}遲到情況不匹配,請(qǐng)核查后更新'.format(member_id))運(yùn)行結(jié)果:

為什么會(huì)選擇存儲(chǔ)到字典中呢?
因?yàn)樽值淇梢院芎玫伢w現(xiàn)出工號(hào)與遲到次數(shù)的對(duì)應(yīng)關(guān)系,即{'工號(hào)': '遲到次數(shù)'}。
然后把【遲到次數(shù)月度統(tǒng)計(jì)(10月更新).xlsx】中的遲到次數(shù),與字典中存儲(chǔ)的遲到次數(shù)進(jìn)行匹配,再判斷相同工號(hào)對(duì)應(yīng)的遲到次數(shù)是否相同。
到此這篇關(guān)于用Python實(shí)現(xiàn)數(shù)據(jù)篩選與匹配實(shí)例的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)篩選與匹配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)將JSON格式文件導(dǎo)入redis
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)將JSON格式文件導(dǎo)入redis的多種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01
Python實(shí)現(xiàn)多條件篩選目標(biāo)數(shù)據(jù)功能【測(cè)試可用】
這篇文章主要介紹了Python實(shí)現(xiàn)多條件篩選目標(biāo)數(shù)據(jù)功能,結(jié)合實(shí)例形式總結(jié)分析了Python3使用內(nèi)建函數(shù)filter、pandas包以及for循環(huán)三種方法對(duì)比分析了列表進(jìn)行條件篩選操作相關(guān)實(shí)現(xiàn)技巧與運(yùn)行效率,需要的朋友可以參考下2018-06-06
Python異常處理機(jī)制結(jié)構(gòu)實(shí)例解析
這篇文章主要介紹了Python異常處理機(jī)制結(jié)構(gòu)實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Python Django form 組件動(dòng)態(tài)從數(shù)據(jù)庫(kù)取choices數(shù)據(jù)實(shí)例
這篇文章主要介紹了Python Django form 組件動(dòng)態(tài)從數(shù)據(jù)庫(kù)取choices數(shù)據(jù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python計(jì)算庫(kù)numpy進(jìn)行方差/標(biāo)準(zhǔn)方差/樣本標(biāo)準(zhǔn)方差/協(xié)方差的計(jì)算
今天小編就為大家分享一篇關(guān)于Python計(jì)算庫(kù)numpy進(jìn)行方差/標(biāo)準(zhǔn)方差/樣本標(biāo)準(zhǔn)方差/協(xié)方差的計(jì)算,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
python numpy創(chuàng)造圖像矩陣示例詳解
這篇文章主要為大家介紹了python numpy創(chuàng)造圖像矩陣示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Python成功解決ZeroDivisionError:?division?by?zero的方法過(guò)程
在Python編程中,ZeroDivisionError:divisionbyzero是因?yàn)閲L試除以零所導(dǎo)致的常見(jiàn)錯(cuò)誤,這篇文章詳細(xì)介紹了錯(cuò)誤的原因、解決方案,需要的朋友可以參考下2024-09-09
Python3.9.0 a1安裝pygame出錯(cuò)解決全過(guò)程(小結(jié))
這篇文章主要介紹了Python3.9.0 a1安裝pygame出錯(cuò)解決全過(guò)程(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

