我正在尝试从以下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
非常感谢你,对不起我的英语。
答案 0 :(得分:2)
在groupby
上id
,year
和transform('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