zoukankan      html  css  js  c++  java
  • 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的区别.

    • 后续还有更多工作案例分享, 基础, 高阶,都会有的.....

  • 相关阅读:
    需要我们了解的SQL Server阻塞原因与解决方法
    SQL Server应用模式之OLTP系统性能分析
    第一章 scala环境搭建
    IO
    装饰器模式
    java 泛型方法
    文件格式转换
    spring ioc
    深入浅出Java模式设计之模板方法模式
    struts2
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/11657044.html
Copyright © 2011-2022 走看看