在不应用的情况下计算熊猫中多列的条纹

时间:2019-10-08 03:44:22

标签: python pandas group-by

我有一个像这样的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亿行,因此我想避免使用“应用”,因为那样会很慢。

是否有更好,更快的方法?

0 个答案:

没有答案