Pandas如何统计同姓名下连续重叠时间记录并判断组长度是否≥3
实现步骤与完整代码
首先完成基础数据预处理,再按姓名分组识别连续重叠块,最后生成要求的两个标志字段即可:
import pandas as pd import io # 可替换为自身数据源,此处先用示例1测试,替换为示例2代码也可正常运行 df = pd.read_csv(io.StringIO(""" Record ID;Record Name;Record Start;Record End 1;SMITH, JOHN;10/20/20 8:00 AM;10/20/20 9:30 AM 2;SMITH, JOHN;10/20/20 9:20 AM;10/20/20 10:30 AM 3;SMITH, JOHN;10/20/20 10:20 AM;10/20/20 11:00 AM 4;SMITH, JOHN ;10/20/20 1:00 PM;10/20/20 2:15 PM 5;SMITH, JOHN;10/20/20 2:00 PM;10/20/20 4:00 PM """),sep=';') # 1. 数据预处理 # 去除姓名字段前后空格,避免分组异常 df['Record Name'] = df['Record Name'].str.strip() # 将起止时间转为datetime类型,保证时间比较逻辑正确 df['Start'] = pd.to_datetime(df['Record Start']) df['End'] = pd.to_datetime(df['Record End']) # 2. 按姓名分组处理连续重叠逻辑 def process_group(group): # 按记录ID升序排序,保证时序判断正确 group = group.sort_values('Record ID').reset_index(drop=True) # 标记当前记录是否与上一条记录重叠 group['prev_overlap'] = group['Start'] < group['End'].shift(1) # 生成连续重叠块的分组ID:遇到不重叠的位置ID+1 group['block_id'] = (~group['prev_overlap']).cumsum() # 统计每个连续重叠块的记录条数 group['block_size'] = group.groupby('block_id')['block_id'].transform('count') # 生成要求的两个标志字段 group['overlap?'] = group['block_size'] >= 2 group['total records consec >=3?'] = group['block_size'] >= 3 return group # 应用分组处理逻辑 df = df.groupby('Record Name', group_keys=False).apply(process_group) # 删除中间计算用的辅助列 df = df.drop(columns=['prev_overlap', 'block_id', 'block_size']) # 输出结果 print(df)
结果验证
- 测试示例1时输出完全匹配预期:前3条属于大小为3的重叠块,两个标志均为True;后2条属于大小为2的重叠块,
overlap?为True,total records consec >=3?为False。 - 测试示例2时所有重叠块最大长度为2,因此
total records consec >=3?全为False,与预期输出一致。
内容的提问来源于stack exchange,提问作者Mystical Me
相关产品推荐
相关产品推荐

