如何用Pandas查询id在start事件5天窗口内是否存在b事件
实现步骤与代码
首先需要将日期列转换为可进行时间运算的datetime类型,之后按id分组处理每个用户的事件:
步骤1:数据预处理
import pandas as pd # 把date列转为datetime格式,才能做时间差计算 df['date'] = pd.to_datetime(df['date'])
步骤2:筛选符合条件的id
提供两种简洁的实现方式:
方法一:合并起始日期后筛选
# 提取每个id对应的start事件日期 start_dates = df[df['event'] == 'start'].set_index('id')['date'].rename('start_date') # 将起始日期合并回原数据表 df_merged = df.merge(start_dates, left_on='id', right_index=True) # 筛选出event为b且日期在start事件后5天内的记录,提取唯一id valid_ids = df_merged[(df_merged['event'] == 'b') & (df_merged['date'] <= df_merged['start_date'] + pd.Timedelta(days=5))]['id'].unique()
方法二:分组直接判断
# 按id分组,检查每组是否存在符合条件的b事件 valid_ids = df.groupby('id').apply( lambda group: # 找到当前组的start日期,判断是否有b事件在5天窗口内 (group[group['event'] == 'b']['date'] <= group[group['event'] == 'start']['date'].iloc[0] + pd.Timedelta(days=5)).any() # 只保留判断结果为True的id )[lambda res: res].index.tolist()
结果说明
运行上述代码后,valid_ids会得到示例数据中符合条件的id列表:['01', '03'](01的b事件在start后3天,03的b事件在start后3天,均在5天窗口内;02无b事件,04仅存在start事件)
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

