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。如果我错了,你能纠正我吗?