如何在季度Pandas DataFrame中按公司ID创建虚拟变量?

lsmd5eda  于 2023-01-24  发布在  其他
关注(0)|答案(1)|浏览(146)

我有三个基本上相关的问题,关于我正在使用的Pandas季度数据框中的假人的创建。第一个问题是:我如何创建一个“虚拟”变量,使每个公司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       .           .

我的第二个问题是:如何创建一个“Dummy”变量,在最后一个季度之后的一年内将四个季度设置为1(每个公司最后一个季度的日期不同)?如下面的数据框所示:

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       .           .

最后,关于上一个表,对于每个公司ID,如何去掉第一个Dummy = 1之前的前四个季度(Dummy = 0),并保留最后一个Dummy = 1之后Dummy = 0的季度?,以获得如下所示的最终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       .           .

提前感谢您的帮助!!

2ic8powd

2ic8powd1#

对于每一家公司,如果我们将最后一个季度编号为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), 1, 0))[s.between(5, 9)]

相关问题