Pandas按指定时间范围识别重复项并标记父重复项及统计重复数
Pandas 实现按ID、金额、5分钟时间间隔识别重复记录方案
实现思路
- 先将日期列转为Pandas datetime类型,支撑时间差运算
- 按
ID、Amount分组,对组内数据按时间升序排序 - 计算组内相邻记录的时间差,超过5分钟就标记为新的重复组
- 给每个重复组分配唯一标识,统计组内记录总数
- 标记每个重复组的第一条记录为父重复项
完整实现代码
import pandas as pd # 构造示例数据,实际使用时替换为自己的数据源导入逻辑即可 data = { 'ID': [1,1,1,1,1,2,2,2], 'Amount': [23,23,23,23,24,43,43,432], 'Date': [ '3/1/2021 12:00PM', '3/1/2021 12:01PM', '3/1/2021 12:05PM', '3/1/2021 12:09PM', '3/2/2021 12:05PM', '3/1/2021 12:00PM', '3/1/2021 12:01PM', '3/1/2021 12:05PM' ] } df = pd.DataFrame(data) # 1. 转换日期列为标准datetime格式,注意匹配自己的日期字符串格式 df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y %I:%M%p') # 2. 按ID、Amount分组后按时间排序,保证时间顺序正确 df = df.sort_values(['ID', 'Amount', 'Date']).reset_index(drop=True) # 3. 计算组内相邻记录的时间差,单位为分钟 df['time_diff'] = df.groupby(['ID', 'Amount'])['Date'].diff().dt.total_seconds() / 60 # 标记新重复组的起点:首条记录/和前一条间隔超过5分钟 df['new_group'] = (df['time_diff'].isna()) | (df['time_diff'] > 5) # 4. 给每个重复组分配唯一ID df['dup_group_id'] = df.groupby(['ID', 'Amount'])['new_group'].cumsum() # 5. 统计每个重复组的总记录数(包含父项) df['group_total_count'] = df.groupby(['ID', 'Amount', 'dup_group_id'])['dup_group_id'].transform('count') # 6. 标记父重复项:每个重复组的第一条记录 df['is_parent'] = df.groupby(['ID', 'Amount', 'dup_group_id']).cumcount() == 0 # 可选:删除中间计算产生的辅助列 df = df.drop(columns=['time_diff', 'new_group'])
结果说明
注:上述代码采用相邻时间差判定逻辑,即组内只要相邻两条间隔<=5分钟就归为同一个重复组,适用于连续触发的重复场景。如果需要所有记录和组内第一条的间隔<=5分钟才算同一组,将
new_group的判定逻辑替换为和组内首条记录的时间差对比即可。
以示例数据为例,运行后ID=1、Amount=23的前4条记录相邻间隔均不超过5分钟,会被归为同一个重复组,组总数量为4,12:00的第一条记录标记为父项;12:09的记录和前一条12:05间隔4分钟,符合规则会被纳入同一组。
内容的提问来源于stack exchange,提问作者Akshat Shreemali
相关产品推荐
相关产品推荐

