我有以下数据框:
Name Date
Alice 2023-01-01
Alice 2023-02-01
Bob 2023-02-15
Alice 2023-03-01
Bob 2023-03-20
Alice 2023-04-01
我想计算在Date之前的过去3个月内,每个Name出现了多少次。所以,我期望得到以下输出:
Name Date Date_3_Months_Ago N_Past_3_Months
0 Alice 2023-01-01 2022-10-01 1
1 Alice 2023-02-01 2022-11-01 2
3 Alice 2023-03-01 2022-12-01 3
5 Alice 2023-04-01 2023-01-01 4
2 Bob 2023-02-15 2022-11-15 1
4 Bob 2023-03-20 2022-12-20 2
我可以使用 apply 函数或 for 循环获得此输出。但是,我对矢量化解决方案感兴趣,因为我的数据框非常大。
我使用 pandas Dateoffset 从 df['Date'] 中减去 3 个月,并使用 groupby 和 cumcount 来计算每个名称的条目,+ 1 因为 cumcount 从 0 开始计数
df = df.sort_values(by=['Name', 'Date'])
df['Date'] = pd.to_datetime(df['Date'])
df['Date_3_Months_Ago'] = df['Date'] - pd.DateOffset(months=3)
df['N_Past_3_Months'] = df.groupby('Name').cumcount() + 1
最终结果:
Name Date Date_3_Months_Ago N_Past_3_Months
0 Alice 2023-01-01 2022-10-01 1
1 Alice 2023-02-01 2022-11-01 2
3 Alice 2023-03-01 2022-12-01 3
5 Alice 2023-04-01 2023-01-01 4
2 Bob 2023-02-15 2022-11-15 1
4 Bob 2023-03-20 2022-12-20 2