【发布时间】:2021-11-18 17:20:40
【问题描述】:
下面是一个示例数据框:
df = pd.DataFrame({'StudentName': ['Anil','Ramu','Ramu','Anil','Peter','Peter','Anil','Ramu','Peter','Anil'],
'ExamDate': ['2021-01-10','2021-01-20','2021-02-22','2021-03-30','2021-01-04','2021-06-06','2021-04-30','2021-07-30','2021-07-08','2021-09-07'],
'Result': ['Fail','Pass','Fail','Pass','Pass','Pass','Pass','Pass','Fail','Pass']})
StudentName ExamDate Result
0 Anil 2021-01-10 Fail
1 Ramu 2021-01-20 Pass
2 Ramu 2021-02-22 Fail
3 Anil 2021-03-30 Pass
4 Peter 2021-01-04 Pass
5 Peter 2021-06-06 Pass
6 Anil 2021-04-30 Pass
7 Ramu 2021-07-30 Pass
8 Peter 2021-07-08 Fail
9 Anil 2021-09-07 Pass
对于每一行,我想计算自该学生上次未通过测试以来的天数:
df = pd.DataFrame({'StudentName': ['Anil','Ramu','Ramu','Anil','Peter','Peter','Anil','Ramu','Peter','Anil'],
'ExamDate': ['2021-01-10','2021-01-20','2021-02-22','2021-03-30','2021-01-04','2021-06-06','2021-04-30','2021-07-30','2021-07-08','2021-09-07'],
'Result': ['Fail','Pass','Fail','Pass','Pass','Pass','Pass','Pass','Fail','Pass'],
'LastFailedDays': [0, 0, 0, 79, 0, 0, 110, 158, 0, 240]})
StudentName ExamDate Result LastFailedDays
0 Anil 2021-01-10 Fail 0
1 Ramu 2021-01-20 Pass 0
2 Ramu 2021-02-22 Fail 0
3 Anil 2021-03-30 Pass 79
4 Peter 2021-01-04 Pass 0
5 Peter 2021-06-06 Pass 0
6 Anil 2021-04-30 Pass 110
7 Ramu 2021-07-30 Pass 158
8 Peter 2021-07-08 Fail 0
9 Anil 2021-09-07 Pass 240
例如:
- Anil 在 2021 年 1 月 10 日失败,因此该行将是零天。
- Anil 的下一个成功记录是在 2021-03-30,因此该行的天数将是从他之前的失败日期 2021-01-10 到 2021-03-30 的天数,即 79 天。
- 阿尼尔的第三条记录,也是成功的,是在2021-04-30,所以天数会再次出现,天数2021-01-10(他最后失败的日期)到2021-04- 30,即 110 天。
常规循环是可行的,但我正在寻找更传统的 Pandas 解决方案。我猜groupby 是可能的。
【问题讨论】:
-
无法理解您如何计算 LastFailedDays。例如,anil 在 21-01-10、21-03-30、21-04-30 和 21-09-07 失败了,最后一天怎么算 240 天?第一次失败后的几天?
-
我已经用一个例子解释了这个场景。 @UlisesBussi
标签: python pandas pandas-groupby