如何基于用户登录DataFrame识别7天内3次独立登录的用户?
解决留存用户识别问题:找出7天周期内有3次不同日期登录的用户
嘿,这个问题我熟!咱们用Pandas一步步来解决,思路清晰又高效:
第一步:数据预处理
首先得把时间戳转换成可处理的datetime格式,并且提取出日期部分(因为同一天多次登录只算一次):
import pandas as pd # 转换时间戳为datetime类型 df['time_stamp'] = pd.to_datetime(df['time_stamp']) # 提取日期列,用于后续去重和分析 df['date'] = df['time_stamp'].dt.date
第二步:用户登录日期去重
同一个用户同一天多次登录,我们只需要保留一个日期记录:
# 按用户分组,获取每个用户的唯一登录日期列表 user_unique_dates = df.drop_duplicates(subset=['user_id', 'date']).sort_values(['user_id', 'date'])
第三步:识别留存用户(核心逻辑)
我们需要判断:是否存在一个7天的窗口,该用户在窗口内有至少3个不同的登录日期。这里推荐用Pandas的滚动窗口功能,简洁又高效:
# 对每个用户,计算7天滚动窗口内的登录日期数量 user_unique_dates['rolling_7d_count'] = user_unique_dates.groupby('user_id')['date'].rolling( window='7D', # 窗口大小为7天 on='date' # 基于date列计算窗口 ).count().reset_index(level=0, drop=True) # 筛选出至少有一次窗口内登录日期>=3的用户 adopted_users = user_unique_dates[user_unique_dates['rolling_7d_count'] >= 3]['user_id'].unique().tolist()
验证你的示例数据
咱们来对应你给的数据看看结果:
- 用户1的登录日期:2013-01-01、01-03、01-06、01-10 → 前三个日期都在2013-01-01到2013-01-07这个7天窗口内,符合条件
- 用户2只有1次登录,不符合
- 用户3的登录日期:01-04、01-05、01-11 → 01-04到01-11间隔7天,没有7天窗口能包含3个日期,不符合
- 用户4的登录日期:01-04、01-05、01-12 → 同样没有符合条件的7天窗口,不符合
最终结果adopted_users就是[1],完全符合预期。
另一种手动判断的思路(适合理解逻辑)
如果你想手动实现窗口判断,可以写一个辅助函数,遍历每个用户的登录日期,检查是否存在三个日期的时间差≤6天(因为7天周期内,最早和最晚日期的差最多6天):
def check_adopted(dates): sorted_dates = sorted(dates) # 遍历所有连续三个日期的组合 for i in range(len(sorted_dates) - 2): if (sorted_dates[i+2] - sorted_dates[i]).days <= 6: return True return False # 应用函数到每个用户 user_dates_summary = df.groupby('user_id')['date'].unique().reset_index() user_dates_summary['is_adopted'] = user_dates_summary['date'].apply(check_adopted) adopted_users = user_dates_summary[user_dates_summary['is_adopted']]['user_id'].tolist()
这个方法和滚动窗口的结果一致,适合用来理解背后的逻辑。
内容的提问来源于stack exchange,提问作者rohan23
相关产品推荐
相关产品推荐

