Рассчитать полосу на нескольких столбцах в пандах без применения - PullRequest
0 голосов
/ 08 октября 2019

У меня есть 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», так как это будет очень медленно.

Есть ли лучший, более быстрый способсделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...