我有一个按时间降序排列的数据框,并按
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
提前非常感谢您。
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