Pandas Dataframe 中的 Cumsum,但在每年新年的特定日期重置为零

问题描述 投票:0回答:1

我有一个按时间降序排列的数据框,并按

Race_ID
Student_ID
索引。

Race_ID   Date           Student_ID      Mark     
1         1/10/2023      1               5        
1         1/10/2023      2               8        
1         1/10/2023      3               7        
8         1/10/2023      4               4        
8         1/1/2023       1               9        
8         1/1/2023       2               3        
8         1/1/2023       3               5        
8         1/1/2023       4               10       
2         11/9/2022      1               2        
2         11/9/2022      2               4        
2         11/9/2022      3               9        
3         17/4/2022      5               3        
3         17/4/2022      2               4        
3         17/4/2022      3               3        
3         17/4/2022      4               7        
4         1/3/2022       1               4        
4         1/3/2022       2               9        
5         1/1/2021       1               6        
5         1/1/2021       2               1        
5         1/1/2021       3               8        

我想创建一个新列

Seasonal_Mark
,它是每个学生的
cumsum
Mark
,但需要注意的是,每年 2 月 1 日总和设置为零。所以期望的结果看起来像:

Race_ID   Date           Student_ID      Mark     Seasonal_Mark 
1         1/10/2023      1               5        5
1         1/10/2023      2               8        8
1         1/10/2023      3               7        7
8         1/10/2023      4               4        4
8         1/1/2023       1               9        15 (4+2+9)
8         1/1/2023       2               3        19 (4+9+4+2)
8         1/1/2023       3               5        17 (9+3+5)
8         1/1/2023       4               10       17 (7+10)                  
2         11/9/2022      1               2        6  (4+2)
2         11/9/2022      2               4        17 (4+9+4)
2         11/9/2022      3               9        12 (9+3)
3         17/4/2022      5               3        3
3         17/4/2022      2               4        13 (4+9)
3         17/4/2022      3               3        3
3         17/4/2022      4               7        7
4         1/3/2022       1               4        4
4         1/3/2022       2               9        9
5         1/1/2021       1               6        6
5         1/1/2021       2               1        1
5         1/1/2021       3               8        8

提前非常感谢您。

python-3.x pandas dataframe group-by cumsum
1个回答
0
投票

您可以从 2 月 1 日开始使用自定义的年度

Period
作为次要石斑鱼,为此使用
to_period
A-JAN
作为频率:

df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)

df['Seasonal_Mark'] = (df.sort_values(by='Date')
                         .groupby(['Student_ID', df['Date'].dt.to_period('A-JAN')])
                       ['Mark'].cumsum()
                      )

输出:

    Race_ID       Date  Student_ID  Mark  Seasonal_Mark
0         1 2023-10-01           1     5              5
1         1 2023-10-01           2     8              8
2         1 2023-10-01           3     7              7
3         8 2023-10-01           4     4              4
4         8 2023-01-01           1     9             15
5         8 2023-01-01           2     3             20
6         8 2023-01-01           3     5             17
7         8 2023-01-01           4    10             17
8         2 2022-09-11           1     2              6
9         2 2022-09-11           2     4             17
10        2 2022-09-11           3     9             12
11        3 2022-04-17           5     3              3
12        3 2022-04-17           2     4             13
13        3 2022-04-17           3     3              3
14        3 2022-04-17           4     7              7
15        4 2022-03-01           1     4              4
16        4 2022-03-01           2     9              9
17        5 2021-01-01           1     6              6
18        5 2021-01-01           2     1              1
19        5 2021-01-01           3     8              8
© www.soinside.com 2019 - 2024. All rights reserved.