Pandas按人员分组统计DataFrame内会话时间的重叠帧计数
按分组维度计算会话时间重叠数实现
问题说明
- 原有全表重叠计数逻辑会跨所属人员匹配会话,不符合仅统计同人员会话重叠的业务要求
- 核心偏差:原有两两时间比对的广播矩阵覆盖整张表,未限制匹配范围为当前行所属的
name分组
实现思路
- 直接复用原有的重叠判断逻辑,先按
name字段对数据集分组 - 对每个分组的子表单独执行重叠计数计算,从根源上避免跨组匹配
- 最后拼接所有分组的计算结果,得到完整的输出数据集
具体代码实现
- 预处理时间字段,确保可直接做大小比较:
import pandas as pd # 转换时间格式为datetime类型 df['start_time'] = pd.to_datetime(df['start_time']) df['end_time'] = pd.to_datetime(df['end_time'])
- 定义分组内部的重叠计数函数,完全复用原有比对逻辑:
def calc_group_overlap(group_df): # 仅在当前分组的子表内执行广播比对 ends = group_df['start_time'].values < group_df['end_time'].values[:, None] starts = group_df['start_time'].values > group_df['start_time'].values[:, None] # 按原有规则计算重叠计数 group_df['overlap'] = (ends & starts).sum(0) return group_df
- 按
name分组应用函数,关闭分组键避免引入额外列:
# 分组计算后拼接结果,不保留分组键列 df = df.groupby('name', group_keys=False).apply(calc_group_overlap)
输出效果
执行上述代码后,得到的结果完全匹配预期:
id start_time end_time name overlap 1 2021-02-10 10:37:35 2021-02-10 12:16:22 Bob 2 2 2021-02-10 11:09:39 2021-02-10 13:06:25 Bob 1 3 2021-02-10 12:10:33 2021-02-10 17:06:26 Bob 0 4 2021-02-10 15:05:08 2021-02-10 21:07:05 Sally 1 5 2021-02-10 21:07:26 2021-02-10 21:26:37 Sally 0
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

