我有一个像这样的DataFrame(列“行”可以忽略,它只能在以后引用它):
row | date | type1 | type2 | column1 | column2
------------------------------------------------------------
1 | 2019-01-01 | 123 | A | 1 | 0
2 | 2019-01-01 | 123 | B | 1 | 1
3 | 2019-02-01 | 123 | A | 1 | 1
4 | 2019-03-01 | 123 | A | 1 | 0
5 | 2019-04-01 | 123 | A | 1 | 1
6 | 2019-04-01 | 123 | B | 0 | 1
7 | 2019-05-01 | 123 | A | 1 | 0
8 | 2019-05-01 | 123 | B | 1 | 1
9 | 2019-06-01 | 123 | A | 1 | 1
10 | 2019-07-01 | 123 | A | 1 | 0
11 | 2019-08-01 | 123 | A | 0 | 0
12 | 2019-08-01 | 123 | B | 1 | 1
13 | 2019-09-01 | 123 | A | 1 | 1
14 | 2019-10-01 | 123 | A | 0 | 1
15 | 2019-10-01 | 123 | B | 1 | 0
16 | 2019-11-01 | 123 | A | 1 | 0
17 | 2019-01-01 | 456 | A | 1 | 1
18 | 2019-01-01 | 456 | B | 1 | 1
19 | 2019-02-01 | 456 | A | 1 | 1
20 | 2019-03-01 | 456 | A | 1 | 0
21 | 2019-04-01 | 456 | A | 1 | 1
22 | 2019-04-01 | 456 | B | 0 | 1
23 | 2019-05-01 | 456 | A | 1 | 0
24 | 2019-05-01 | 456 | B | 1 | 1
25 | 2019-06-01 | 456 | A | 1 | 1
26 | 2019-07-01 | 456 | A | 1 | 0
27 | 2019-08-01 | 456 | A | 0 | 0
28 | 2019-08-01 | 456 | B | 1 | 1
29 | 2019-09-01 | 456 | A | 1 | 1
30 | 2019-10-01 | 456 | A | 0 | 1
31 | 2019-10-01 | 456 | B | 1 | 0
32 | 2019-11-01 | 456 | A | 1 | 0
我想要一个新列,该列按“ type1”分组,给出(过去日期的column1)和(当前行的column2)的条纹。关键是“过去的日期”。
例如,第6行包含'2019-04-01'之前所有日期(包括第1至4行)的第1列的条纹以及第6行的第2列的条纹。
结果是这样的:
row | date | type1 | type2 | column1 | column2 | streak
--------------------------------------------------------------------
1 | 2019-01-01 | 123 | A | 1 | 0 | 0
2 | 2019-01-01 | 123 | B | 1 | 1 | 1
3 | 2019-02-01 | 123 | A | 1 | 1 | 3
4 | 2019-03-01 | 123 | A | 1 | 0 | 0
5 | 2019-04-01 | 123 | A | 1 | 1 | 5
6 | 2019-04-01 | 123 | B | 0 | 1 | 5
7 | 2019-05-01 | 123 | A | 1 | 0 | 0
8 | 2019-05-01 | 123 | B | 1 | 1 | 1
9 | 2019-06-01 | 123 | A | 1 | 1 | 3
10 | 2019-07-01 | 123 | A | 1 | 0 | 0
11 | 2019-08-01 | 123 | A | 0 | 0 | 0
12 | 2019-08-01 | 123 | B | 1 | 1 | 5
13 | 2019-09-01 | 123 | A | 1 | 1 | 2
14 | 2019-10-01 | 123 | A | 0 | 1 | 3
15 | 2019-10-01 | 123 | B | 1 | 0 | 0
16 | 2019-11-01 | 123 | A | 1 | 0 | 0
17 | 2019-01-01 | 456 | A | 1 | 1 | 1
18 | 2019-01-01 | 456 | B | 1 | 1 | 1
19 | 2019-02-01 | 456 | A | 1 | 1 | 3
20 | 2019-03-01 | 456 | A | 1 | 0 | 0
21 | 2019-04-01 | 456 | A | 1 | 1 | 5
22 | 2019-04-01 | 456 | B | 0 | 1 | 5
23 | 2019-05-01 | 456 | A | 1 | 0 | 0
24 | 2019-05-01 | 456 | B | 1 | 1 | 1
25 | 2019-06-01 | 456 | A | 1 | 1 | 3
26 | 2019-07-01 | 456 | A | 1 | 0 | 0
27 | 2019-08-01 | 456 | A | 0 | 0 | 0
28 | 2019-08-01 | 456 | B | 1 | 1 | 5
29 | 2019-09-01 | 456 | A | 1 | 1 | 2
30 | 2019-10-01 | 456 | A | 0 | 1 | 3
31 | 2019-10-01 | 456 | B | 1 | 0 | 0
32 | 2019-11-01 | 456 | A | 1 | 0 | 0
还请注意,第17行的条纹值不为3,因为列type1包含不同的值,所以条纹再次开始。
由于DataFrame包含大约1亿行,因此我想避免使用“应用”,因为那样会很慢。
是否有更好,更快的方法?