如何使用Pandas计算月度维度的3个月滚动活跃用户数量
实现方案
核心思路
- 先把原始数据转为「用户×月度」的活跃矩阵,每个位置标记1代表用户当月活跃,0代表不活跃
- 对每个用户的月度活跃序列做3个月窗口滚动求和,求和结果等于3即满足连续3个月活跃的条件
- 按月份统计满足条件的用户总数,前2个月因窗口长度不足返回空值
完整代码实现
import pandas as pd # 1. 加载数据并格式化日期列 data = { 'MONTH': ['2021-04-01', '2021-04-01', '2021-05-01', '2021-06-01', '2021-06-01', '2021-07-01', '2021-07-01', '2021-08-01', '2021-08-01'], 'User': ['A', 'B', 'B', 'A', 'B', 'A', 'B', 'A', 'B'] } df = pd.DataFrame(data) df['MONTH'] = pd.to_datetime(df['MONTH']) # 2. 构造用户-月度活跃矩阵 user_month_active = df.pivot_table( index='User', columns='MONTH', aggfunc='size', fill_value=0 ) # 【可选补充】如果存在整月无任何活跃的情况,先补全连续月份,避免窗口错位 # all_months = pd.date_range(start=df['MONTH'].min(), end=df['MONTH'].max(), freq='MS') # user_month_active = user_month_active.reindex(columns=all_months, fill_value=0) # 3. 计算3个月滚动活跃标记,求和等于3代表连续3个月活跃 rolling_active = user_month_active.rolling(window=3, axis=1).sum() == 3 # 4. 按月份统计符合条件的用户数 result = rolling_active.sum().reset_index(name='Active_User_Count') # 前2个月替换为NaN,匹配预期输出 result.loc[[0,1], 'Active_User_Count'] = pd.NA print(result)
输出结果
运行上述代码得到的结果和你期望的完全一致:
MONTH Active_User_Count 0 2021-04-01 <NA> 1 2021-05-01 <NA> 2 2021-06-01 1 3 2021-07-01 1 4 2021-08-01 2
内容的提问来源于stack exchange,提问作者MOA
相关产品推荐
相关产品推荐

