回复“书籍”即可获赠Python从入门到进阶共10本电子书
大家好,我是皮皮。
前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个工作中Python自动化处理实战问题,一起来看看吧。问题描述:
数据在提供的数据表中,在表有编号、环节、审核人、金额、结束时间5列,对【编号、环节、审核人、金额】四条件进行分组,分组内结束时间升序排列,分组内结束时间相差20秒以内的,只保留第一条记录。
大佬再请问下 分组内结束时间相差20秒以内的,只保留第一条记录 这个怎么实现? 这个做出来的老是有问题 有个窗口函数 用了数据又对不太上。
【隔壁😼山楂】在这有个疑问,同一个分组内有三个时间,2023-11-27 15:50:00,2023-11-27 15:50:05,2023-11-27 15:50:25,按你这个下来应该剩几个时间?粉丝回答是第1个和第3个。最终效果是:实现分组内任意2个时间点时间差都是大于20s。
这里【郑煜哲·Xiaopang】给出了自己的思路,如上图所示。后来【巭孬🕷】说到:先排序,再求上下行的时间差,命令好像是diff?,然后再取时间差在20秒内的,再提取出第一条。
后来【瑜亮老师】给了一份代码,如下所示:
import pandas as pd
# 读取Excel文件
df = pd.read_excel('工作量计算.xlsx', index_col=None)
# print(df)
# 按照"编号"、"环节"、"审核人"、"金额"分组,并对"结束时间"列做升序排列
df = df.groupby(['编号', '环节', '审核人', '金额']).apply(lambda x: x.sort_values('结束时间', ascending=True))
df.reset_index(drop=True, inplace=True)
df['结束时间'] = pd.to_datetime(df['结束时间']) # 转换为日期时间格式
def filter_rows(group):
# 计算时间差,删除时间差小于20秒的记录,只保留第一条记录
diff = group.groupby('编号')['结束时间'].diff()
mask = (diff.dt.total_seconds() < 20)
group = group[~mask].drop_duplicates(keep='first')
return group
# 对每个分组中的'结束时间'列进行去重操作
result = df.groupby(['编号', '环节', '审核人', '金额']).apply(filter_rows)
# 重新设置索引
result.reset_index(drop=True, inplace=True)
# 输出结果
print(result)
代码运行后,结果还剩余3394行:
大家好,我是皮皮。这篇文章主要盘点了一个工作中Python自动化处理实战问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。
最后感谢粉丝【哎呦喂 是豆子~】提出的问题,感谢【瑜亮老师】、【隔壁😼山楂】、【郑煜哲·Xiaopang】、【巭孬🕷】给出的思路,感谢【莫生气】等人参与学习交流。
【提问补充】温馨提示,大家在群里提问的时候。可以注意下面几点:如果涉及到大文件数据,可以数据脱敏后,发点demo数据来(小文件的意思),然后贴点代码(可以复制的那种),记得发报错截图(截全)。代码不多的话,直接发代码文字即可,代码超过50行这样的话,发个.py文件就行。
大家在学习过程中如果有遇到问题,欢迎随时联系我解决(我的微信:pdcfighting1),应粉丝要求,我创建了一些ChatGPT机器人交流群和高质量的Python付费学习交流群和付费接单群,欢迎大家加入我的Python学习交流群和接单群!
小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

------------------- End -------------------
往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Python学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行
/今日留言主题/
随便说一两句吧~~
原文作者:Python爬虫与数据挖掘;如有侵权,请联系管理员删除。