如何用Pandas识别各团队每行7秒内是否存在event=2的记录
问题描述
我有如下格式的DataFrame:
data = {'event': [1, 1, 3, 2, 3, 1, 2, 3, 4, 5], 'team': ['A', 'A', 'B', 'A', 'B', 'C', 'C', 'C', 'D', 'D'], 'timeStamp': ['2023-07-23 14:57:13.357', '2023-07-23 14:57:14.357', '2023-07-23 14:57:15.357', '2023-07-23 14:57:16.357', '2023-07-23 14:57:20.357', '2023-07-23 14:57:13.357', '2023-07-23 14:57:18.357', '2023-07-23 14:57:23.357', '2023-07-23 14:57:23.357', '2023-07-23 14:57:25.357']}
需要为每个团队的每一行数据,判断该行的timeStamp之后7秒内是否存在event为2的行,期望输出如下:
| event | team | timeStamp | is_2_in_7_sec |
|---|---|---|---|
| 1 | A | 2023-07-23 14:57:13.357 | TRUE |
| 1 | A | 2023-07-23 14:57:14.357 | TRUE |
| 3 | B | 2023-07-23 14:57:15.357 | FALSE |
| 2 | A | 2023-07-23 14:57:16.357 | FALSE |
| 3 | B | 2023-07-23 14:57:20.357 | FALSE |
| 1 | C | 2023-07-23 14:57:13.357 | TRUE |
| 2 | C | 2023-07-23 14:57:18.357 | FALSE |
| 3 | C | 2023-07-23 14:57:23.357 | FALSE |
| 4 | D | 2023-07-23 14:57:23.357 | FALSE |
| 5 | D | 2023-07-23 14:57:25.357 | FALSE |
这个需求在R中实现较为容易,但我在Python中遇到了瓶颈。
Python实现方案
可以用pandas结合时间处理完成需求,步骤如下:
- 转换
timeStamp列为可计算的datetime类型 - 按团队分组,提取每个团队内所有
event=2的时间点 - 逐行判断当前时间之后7秒内是否存在符合条件的时间点,生成结果列
完整代码如下:
import pandas as pd # 构建DataFrame data = {'event': [1, 1, 3, 2, 3, 1, 2, 3, 4, 5], 'team': ['A', 'A', 'B', 'A', 'B', 'C', 'C', 'C', 'D', 'D'], 'timeStamp': ['2023-07-23 14:57:13.357', '2023-07-23 14:57:14.357', '2023-07-23 14:57:15.357', '2023-07-23 14:57:16.357', '2023-07-23 14:57:20.357', '2023-07-23 14:57:13.357', '2023-07-23 14:57:18.357', '2023-07-23 14:57:23.357', '2023-07-23 14:57:23.357', '2023-07-23 14:57:25.357']} df = pd.DataFrame(data) # 转换时间列为datetime类型 df['timeStamp'] = pd.to_datetime(df['timeStamp']) # 定义分组处理函数 def check_event_2(group): # 获取当前团队所有event=2的时间点 event_2_times = group[group['event'] == 2]['timeStamp'] # 判断每行时间之后7秒内是否存在event=2的记录 group['is_2_in_7_sec'] = group['timeStamp'].apply( lambda t: any((event_2_times > t) & (event_2_times <= t + pd.Timedelta(seconds=7))) ) # 转换为大写的TRUE/FALSE匹配输出格式 group['is_2_in_7_sec'] = group['is_2_in_7_sec'].map({True: 'TRUE', False: 'FALSE'}) return group # 按团队分组处理数据 result_df = df.groupby('team', group_keys=False).apply(check_event_2) # 输出结果 print(result_df)
代码说明
pd.to_datetime:将字符串时间转为pandas可计算的datetime对象,是时间比较的基础groupby('team').apply:确保只在同一团队内进行时间判断,避免跨团队干扰pd.Timedelta(seconds=7):生成7秒的时间间隔,用于界定判断范围any(...):检查当前行时间之后的7秒窗口内是否存在event=2的记录,最后转换为大写字符串匹配期望输出
运行代码后得到的结果与需求输出完全一致。
内容的提问来源于stack exchange,提问作者Delopera
相关产品推荐
相关产品推荐

