基于时间间隔检查历史记录:为DataFrame新增5分钟内重复购果标记列
为按用户和时间排序的采购DataFrame新增标记列的实现方案
现有一份已按name(用户)和time(时间)排序的水果采购DataFrame,需要为每个唯一用户新增一列purchased_same_fruit_within5minutes,标记当前采购记录的前5分钟内该用户是否购买过相同水果。示例数据如下:
name fruit time purchased_same_fruit_within5minutes 0 Amy apple 10:00 False 1 Amy pear 10:04 False 2 Amy apple 10:06 False (10:00 apple purchase was 6 minutes ago) 3 Amy pear 10:07 True (pear at 10:04) 4 Ben ...
实现步骤
转换时间列为可计算格式
首先要把字符串格式的time列转为datetime类型,否则无法计算时间差:import pandas as pd # 假设原始time列是"HH:MM"格式的字符串 df['time'] = pd.to_datetime(df['time'], format='%H:%M')匹配同用户同水果的上一条采购时间
利用分组+shift()方法,获取每个用户对应每种水果的上一次采购时间:# 按用户和水果分组,取同组的上一条时间记录 df['prev_purchase_time'] = df.groupby(['name', 'fruit'])['time'].shift(1)生成5分钟内的标记列
计算当前时间与上一条时间的差值,判断是否≤5分钟;没有上一条记录的情况直接标记为False:# 计算时间差(单位:分钟),并生成标记列 df['purchased_same_fruit_within5minutes'] = ( (df['time'] - df['prev_purchase_time']).dt.total_seconds() / 60 <= 5 ).fillna(False)(可选)清理中间列
如果不需要中间生成的prev_purchase_time列,可以直接删除:df = df.drop('prev_purchase_time', axis=1)
完整代码示例
import pandas as pd # 构造示例数据 data = { 'name': ['Amy', 'Amy', 'Amy', 'Amy'], 'fruit': ['apple', 'pear', 'apple', 'pear'], 'time': ['10:00', '10:04', '10:06', '10:07'] } df = pd.DataFrame(data) # 转换时间格式 df['time'] = pd.to_datetime(df['time'], format='%H:%M') # 获取同用户同水果的上一次采购时间 df['prev_purchase_time'] = df.groupby(['name', 'fruit'])['time'].shift(1) # 生成目标标记列 df['purchased_same_fruit_within5minutes'] = ( (df['time'] - df['prev_purchase_time']).dt.total_seconds() / 60 <= 5 ).fillna(False) # 清理中间列 df = df.drop('prev_purchase_time', axis=1) print(df)
运行后输出结果:
name fruit time purchased_same_fruit_within5minutes 0 Amy apple 1900-01-01 10:00:00 False 1 Amy pear 1900-01-01 10:04:00 False 2 Amy apple 1900-01-01 10:06:00 False 3 Amy pear 1900-01-01 10:07:00 True
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

