Pandas 數據篩選,去重結合group by


Pandas 數據篩選,去重結合group by

需求

今小伙伴有一個Excel表, 是部門里的小伙9月份打卡記錄, 關鍵字段如下:

姓名, 工號, 日期, 打卡方式, 時間, 詳細位置, IP地址....

脫敏數據:

姓名 工號 日期 方式 時間 ...
小趙 123 2019-09-01 GPS 08:37:50 ....
小趙 123 2019-09-01 GPS 18:10:50 ...
小陳 124 2019-09-01 GPS 08:47:30 ...
小陳 124 2019-09-01 GPS 15:07:50 ...
小陳 124 2019-09-01 GPS 18:07:5 ...
小趙 123 2019-09-02 GPS 08:55:50 ...
小李 125 2019-09-02 PC 13:10:24

即每個小伙伴, 一個月(30天), 正常打卡是60次, 上午,下午各一次/每天. 但真實情況是: 可能忘記打卡,或者一天打了n次, 現要求是 篩選出上班遲到(9:00) 的所有人員信息.

一看, 這用Excel, 透視一下姓名, 然后篩選日期...., 我感覺我的EXCEL水平怕是支撐不了, 但, Pandas可以呀, 5行代碼搞定數據透視和條件過濾.

核心思路:

  • 先按照 性別 進行分組, 然后對每組中, 日期 字段去重, 保留第一條記錄即可.

  • 篩選出 時間 在 9:00 之后的記錄, 存為Excel即可.

完整代碼如下:

import pandas as pd 

# 1. 讀取數據
data = pd.read_excel("9月打卡記錄.xlsx")
data['時間'] = pd.to_datetime(data["時間"], format="%H:%M:%S")

# 2. 先按姓名分組, 再對日期去重,保留第一個值
ret = data.groupby("姓名", as_index=False).apply(lambda df:df.drop_duplicates("日期"))

# 3. 篩選日期,並保存為excel文件
ret[ret["時間"] >= "1900/1/1 09:00:00"].to_excel("9月遲到名單.xlsx", index=False)

該篇的目的是為了鞏固這些常用的知識點, 如 group by 結合 apply 的用法, 匿名函數, 時間字符串處理等.當然會有更復雜情況, 如分組過后, 按日期去重, 保留的第一條記錄, 不是最早打卡的那條? 那這就需要寫排序邏輯了, 這里只是先拋磚引玉一波.

小結

  • pandas 讀取文件, pd.read_excel( ); pd.read_csv( ); pd.read_json( ); pd.read_sql_table( )...

  • 寫入文件: pd.to_excel( ); pd.to_csv( ) ....

  • 字段篩選過濾等操作必須熟練.

  • 時間字符串 與 時間類型 的 互相轉換 datetime 模塊

  • group by 分組聚合, agg(); apply( ), 結合Excel 透視表就很好理解

  • 關於映射: apply(函數名), 應用於整行or列, 對應的還有, applymap 作用每個元素, map()作用於某列Series.

  • 關於匿名函數lambda 的用法及與普通function的區別.

  • 后續還有更多工作案例分享, 基礎, 高階,都會有的.....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM