Python根据组中另一列的连续值删除行

问题描述

我有以下两个索引(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 (将#修改为@)