У меня есть 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 также содержит строку для column1 для всех дат до '2019-04-01' (строки с 1 по 4 включительно), а такжекак column2 для строки 6.
Результат таков:
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 содержит около 100 миллионов строк, я хочу избегать использования «apply», так как это будет очень медленно.
Есть ли лучший, более быстрый способсделать это?