面板数据:使用条件创建新变量

时间:2017-11-20 20:48:05

标签: python pandas

我正在尝试从以下df创建一个新变量。我想创建一个新的二进制(0或1)变量,如果在它们的任何一个季度变量entr等于1,那么在每个季度的每个季度放置1,并且按id。

此数据框的示例转换为:

id     year    quarter   fecha      entr
 1    2007          1     220       0      
 1    2007          2     221       0    
 1    2007          3     222       0 
 1    2007          4     223       0      
 1    2008          1     224       0
 1    2008          2     225       0
 1    2008          3     226       1
 1    2008          4     227       0
 1    2009          1     228       0
 1    2009          2     229       0
 1    2009          3     230       0
 1    2009          4     231       0
 2    2007          1     220       0      
 2    2007          2     221       0    
 2    2007          3     222       0 
 2    2007          4     223       0      
 2    2008          1     224       0
 2    2008          2     225       0
 2    2008          3     226       0
 2    2008          4     227       0
 2    2009          1     228       0
 2    2009          2     229       1
 2    2009          3     230       0
 2    2009          4     231       0     

结果应如下所示:

id     year    quarter   fecha      entr   new variable
 1    2007          1     220       0           0
 1    2007          2     221       0           0
 1    2007          3     222       0           0
 1    2007          4     223       0           0
 1    2008          1     224       0           1
 1    2008          2     225       0           1
 1    2008          3     226       1           1
 1    2008          4     227       0           1
 1    2009          1     228       0           0
 1    2009          2     229       0           0
 1    2009          3     230       0           0
 1    2009          4     231       0           0
 2    2007          1     220       0           0
 2    2007          2     221       0           0
 2    2007          3     222       0           0
 2    2007          4     223       0           0
 2    2008          1     224       0           0
 2    2008          2     225       0           0
 2    2008          3     226       0           0
 2    2008          4     227       0           0
 2    2009          1     228       0           1
 2    2009          2     229       1           1
 2    2009          3     230       0           1
 2    2009          4     231       0           1

非常感谢你,对不起我的英语。

3 个答案:

答案 0 :(得分:2)

groupbyidyeartransform('max')上致电entr

v = df.groupby(['id', 'year']).entr.transform('max')

v
0     0
1     0
2     0
3     0
4     1
5     1
6     1
7     1
8     0
9     0
10    0
11    0
12    0
13    0
14    0
15    0
16    0
17    0
18    0
19    0
20    1
21    1
22    1
23    1
Name: entr, dtype: int64
df['new variable'] = v

如果最大值可能大于1,您可以groupby并在结果上调用clip

df.groupby(['id', 'year']).entr.transform('max').clip(0, 1)

0     0
1     0
2     0
3     0
4     1
5     1
6     1
7     1
8     0
9     0
10    0
11    0
12    0
13    0
14    0
15    0
16    0
17    0
18    0
19    0
20    1
21    1
22    1
23    1
Name: entr, dtype: int64

这对Vaishali的回答也应该有用。

答案 1 :(得分:1)

尝试

S`

注意:在给定的示例中,只需

df['New_var'] = (df.groupby(['id','year']).entr.transform('sum') >= 1).astype(int)

起作用,因为每组中只有一个唯一的

答案 2 :(得分:0)

只是为了好玩

df.groupby(['id','year']).entr.apply(lambda x : x.replace(0,max(x)))
Out[112]: 
0     0
1     0
2     0
3     0
4     1
5     1
6     1
7     1
8     0
9     0
10    0
11    0
12    0
13    0
14    0
15    0
16    0
17    0
18    0
19    0
20    1
21    1
22    1
23    1
Name: entr, dtype: int64