Python 按组获取熊猫中连续发生的事件

Python 按组获取熊猫中连续发生的事件,python,pandas,group-by,Python,Pandas,Group By,我正在使用一个具有id、wage和date的数据帧,如下所示: id wage date 1 100 201212 1 100 201301 1 0 201302 1 0 201303 1 120 201304 1 0 201305 . 2 0 201302 2 0 201303 id wage date n_mont

我正在使用一个具有
id
wage
date
的数据帧,如下所示:

id   wage   date
1    100    201212
1    100    201301             
1     0     201302
1     0     201303
1    120    201304
1     0     201305
      .
2     0     201302
2     0     201303
id   wage   date     n_months_no_income
1    100    201212             0
1    100    201301             0
1     0     201302             1
1     0     201303             2
1    120    201304             0
1     0     201305             1
      .                        .
2     0     201302             1
2     0     201303             2
我想创建一个
n\u months\u no\u income
列,计算给定个人连续多少个月获得
工资==0
,如下所示:

id   wage   date
1    100    201212
1    100    201301             
1     0     201302
1     0     201303
1    120    201304
1     0     201305
      .
2     0     201302
2     0     201303
id   wage   date     n_months_no_income
1    100    201212             0
1    100    201301             0
1     0     201302             1
1     0     201303             2
1    120    201304             0
1     0     201305             1
      .                        .
2     0     201302             1
2     0     201303             2
我觉得这是
groupby('id')
cumcount()
,可能是
diff()
apply()
,然后是
fillna(0)
,但我找不到合适的

你有什么想法吗

下面是一个数据帧示例,以便于复制:

df = pd.DataFrame({'id':[1,1,1,1,1,1,2,2],'wage':[100,100,0,0,120,0,0,0],
 'date':[201212,201301,201302,201303,201304,201305,201302,201303]})

编辑:添加代码以便于使用。

在您的案例中,使用
cumcount
创建两个
groupby
,并使用
cumsum

df.groupby('id').wage.apply(lambda x : x.groupby(x.ne(0).cumsum()).cumcount())
Out[333]: 
0    0
1    0
2    1
3    2
4    0
5    1
Name: wage, dtype: int64

哇,这比预期的要难,但效果很好,谢谢!不过,我可以请你解释一下吗?我对第二个
groupby
有点迷茫,到底发生了什么?@JuanCJ这是在IDB的组中得到第二个组,但分组变量是什么?您正在按每个
id
中不为
0
的所有行的总和进行分组?所以每个组要么是一行不是零,要么是所有连续的行都是零?是吗?每次我认为我掌握了groupby,我都会发现一种新的使用方法。谢谢!结果有6行,但示例
df
有8行。对于第二个
id
组结果为[0,1],而预期结果应为[1,2]。请注意,第二组的所有
工资
行均等于0。如果我错了,你能纠正我吗?