如何用Pandas高效获取各用户对应通知日期前的历史最大活跃日期?
需求说明
我们有一张用户旅程数据表,结构如下:
notification_date | user_id | login_date 2020-01-01 | 1 | null 2020-03-01 | 1 | 2020-03-05 2020-03-10 | 1 | null 2020-03-11 | 1 | 2020-03-11
需要为每条记录添加last_active_date列,规则如下:
- 该列展示对应
notification_date之前(含当日)用户的最大login_date - 若
login_date晚于当前notification_date则不计入
期望结果如下:
notification_date | user_id | login_date | last_active_date 2020-01-01 | 1 | null | null 2020-03-01 | 1 | 2020-03-05 | null 2020-03-10 | 1 | null | 2020-03-05 2020-03-11 | 1 | 2020-03-11 | 2020-03-11
请问如何用Pandas高效地按user_id实现这一需求?
Pandas实现方案
可以通过以下步骤高效完成需求:
- 统一日期类型:将
notification_date和login_date转换为datetime类型,避免字符串比较的误差 - 过滤有效登录记录:仅保留
login_date不晚于当前notification_date的登录日期,无效项标记为时间空值NaT - 分组计算滚动最大值:按
user_id分组后,用滚动窗口计算截止到当前记录的最大有效登录日期
具体代码如下:
import pandas as pd # 构造示例数据 data = { 'notification_date': ['2020-01-01', '2020-03-01', '2020-03-10', '2020-03-11'], 'user_id': [1, 1, 1, 1], 'login_date': [None, '2020-03-05', None, '2020-03-11'] } df = pd.DataFrame(data) # 转换日期列为datetime类型 df['notification_date'] = pd.to_datetime(df['notification_date']) df['login_date'] = pd.to_datetime(df['login_date']) # 生成有效登录日期:仅保留符合时间要求的登录记录 df['valid_login'] = df.apply( lambda x: x['login_date'] if pd.notna(x['login_date']) and x['login_date'] <= x['notification_date'] else pd.NaT, axis=1 ) # 按用户分组,计算滚动最大值(从第一条记录到当前记录的最大有效登录日期) df['last_active_date'] = df.groupby('user_id')['valid_login'].expanding().max().reset_index(level=0, drop=True) # 可选:删除中间辅助列 df = df.drop('valid_login', axis=1) print(df)
代码说明
- 日期类型转换:确保日期列是datetime类型,才能正确进行时间大小比较
- 有效登录过滤:逐行判断登录日期是否符合时间要求,不符合的标记为
NaT,不参与后续最大值计算 - 滚动最大值计算:
expanding().max()会对每个用户的历史记录(从第一条到当前条)计算最大值,完美匹配“截止到当前通知日期的最大有效登录日期”的需求 - 该方法时间复杂度为线性O(n),分组后线性处理数据,对大数据量也能保持高效
内容的提问来源于stack exchange,提问作者titutubs
相关产品推荐
相关产品推荐

