如何在每个季度的Pandas DataFrame中通过公司ID创建虚拟变量?

问题描述

关于在我正在使用的每季熊猫DataFrame中创建傻瓜的问题,我基本上有3个相关问题。 第一个是:如何创建一个“虚拟”变量,该变量将为每个Firm ID的最后四个季度设置1?我想产生以下相同结果:

Firm    Quarter     Dummy
A       2017-03-31  1
A       2016-12-31  1
A       2016-09-30  1
A       2016-06-30  1
A       2016-03-31  0
A       2015-12-31  0
A       2015-09-30  0
A       2015-06-30  0
A       2015-03-31  0
B       2009-06-30  1
B       2009-03-31  1
B       2008-12-31  1
B       2008-09-30  1
B       2008-06-30  0
B       2008-03-31  0
B       2007-12-31  0
B       2007-09-30  0
B       2007-06-30  0
.
.
.
Z       .           .
Z       .           .
Z       .           .

我的第二个问题是:如何创建一个“虚拟”变量,在最后一个季度之后的一年(给定每个公司的最后一个季度的日期不同),则为四个季度设置1?就像下面的DataFrame中一样:

Firm    Quarter     Dummy
A       2017-03-31  0
A       2016-12-31  0
A       2016-09-30  0
A       2016-06-30  0
A       2016-03-31  1
A       2015-12-31  1
A       2015-09-30  1
A       2015-06-30  1
A       2015-03-31  0
B       2009-06-30  0
B       2009-03-31  0
B       2008-12-31  0
B       2008-09-30  0
B       2008-06-30  1
B       2008-03-31  1
B       2007-12-31  1
B       2007-09-30  1
B       2007-06-30  0
.
.
.
Z       .           .
Z       .           .
Z       .           .

最后,关于上一张表,我如何摆脱每个虚拟公司在第一个虚拟人= 1之前的前四个季度(虚拟= 0),并在最后一个虚拟人= 1之后保留虚拟= 0的四分之一ID ?,以获取最终的DataFrame,如下所示:

Firm    Quarter     Dummy
A       2016-03-31  1
A       2015-12-31  1
A       2015-09-30  1
A       2015-06-30  1
A       2015-03-31  0
B       2008-06-30  1
B       2008-03-31  1
B       2007-12-31  1
B       2007-09-30  1
B       2007-06-30  0
.
.
.
Z       .           .
Z       .           .
Z       .           .

在此先感谢您的帮助!

解决方法

对于每个公司,如果我们将最后一个季度编号为1,第二个最后一个编号为2,依此类推,那么您的问题只是一个过滤游戏:

  • 将所有季度1-4分配为Dummy = 1。其余为0
  • 所有5至8季度都分配了Dummy = 1。其余的为0。仅需四分之一到5-9。

代码:

s = df.sort_values('Quarter',ascending=False).groupby('Firm').cumcount().add(1).sort_index()

result1 = df.assign(Dummy=np.where(s.between(1,4),1,0))
result2 = df.assign(Dummy=np.where(s.between(5,8),0))[s.between(5,9)]