如何在季度 Pandas DataFrame 中按公司 ID 创建虚拟变量?
How do I create a dummy variable by firm ID in a quarterly Pandas DataFrame?
我基本上有 3 个关于在我正在使用的季度 pandas DataFrame 中创建 Dummies 的相关问题。
第一个是:如何创建一个“虚拟”变量,为每个公司 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,最后一个季度后一年(给定每个公司最后一个季度的不同日期)?如下面的 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 . .
最后,关于前面的 table,我如何去掉第一个 Dummy = 1 之前的前四个季度 (Dummy = 0),并在最后一个之后保留 dummy = 0 的季度Dummy = 1 for each firm 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), 1, 0))[s.between(5, 9)]
我基本上有 3 个关于在我正在使用的季度 pandas DataFrame 中创建 Dummies 的相关问题。 第一个是:如何创建一个“虚拟”变量,为每个公司 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,最后一个季度后一年(给定每个公司最后一个季度的不同日期)?如下面的 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 . .
最后,关于前面的 table,我如何去掉第一个 Dummy = 1 之前的前四个季度 (Dummy = 0),并在最后一个之后保留 dummy = 0 的季度Dummy = 1 for each firm 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), 1, 0))[s.between(5, 9)]