问题描述
我有以下两个索引(id和year)数据框:
mux = pd.MultiIndex.from_arrays([[0,1,2,2],[1990,1991,1992,1993,1994,1980,1981,1982,1983,1984,1985]],names=['id','year'])
df = pd.DataFrame({'income':pd.Series([0,10,11,15,12,13,10],dtype='int',index=mux)})
df
结果是:
income
id year
0 1990 0
1991 10
1992 11
1993 0
1994 15
1 1991 10
1992 12
1993 15
1994 0
2 1980 11
1981 13
1982 15
1983 0
1984 0
1985 10
我想做的是仅在ID的第n个周期内连续保留收入连续大于0的数据。例如上面的例子,假设n = 3。
我尝试做的是以下事情:
df['flag'] = [0 for i in range(len(df.index))]
df.flag[df.income > 0] = 1
df['cnt'] = df.groupby('id').flag.apply(lambda x: x.shift().fillna(0).cumsum()).astype(int)
根据其他堆栈溢出的答案,基本上创建一个虚拟变量,当收入大于0时等于1,并将其累加。 但是,这将产生以下结果:
income flag cnt
id year
0 1990 0 0 1
1991 10 1 1
1992 11 1 2
1993 0 0 3
1994 15 1 3
1 1991 10 1 1
1992 12 1 2
1993 15 1 3
1994 0 0 4
2 1980 11 1 1
1981 13 1 2
1982 15 1 3
1983 0 0 4
1984 0 0 4
1985 10 1 4
相反,我想要的是以下内容:
income flag cnt
id year
0 1990 0 0 0
1991 10 1 1
1992 11 1 2
1993 0 0 0
1994 15 1 1
1 1991 10 1 1
1992 12 1 2
1993 15 1 3
1994 0 0 0
2 1980 11 1 1
1981 13 1 2
1982 15 1 3
1983 0 0 0
1984 0 0 0
1985 10 1 1
完成此操作后,我想删除所有不属于第n个连续正收入的观察值。我想要达到的最终结果是:
income flag cnt
id year
1 1991 10 1 1
1992 12 1 2
1993 15 1 3
2 1980 11 1 1
1981 13 1 2
1982 15 1 3
我遇到了创建一个变量的问题,该变量在收入小于或等于0时会重置为0。任何帮助或提示都将不胜感激!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)