我有一个如下所示的熊猫数据框:
id event_type datetime
1 loginScreen 2019-07-14 18:00:40.671529
1 loginSuccess 2019-07-14 18:00:50
1 accountPage 2019-07-14 18:00:51
1 joinGame 2019-07-14 18:00:53
1 addCash 2019-07-14 18:00:55
2 signupScreen 2019-07-14 21:00:00
2 signupfailed 2019-07-14 21:01:00
3 signupScreen 2019-07-14 22:00:00
3 signupSuccess 2019-07-14 22:00:02
3 joinGame 2019-07-14 22:00:04
输出数据框:
id number_events_before_join number_events_after_join
1 3 1
2 0 0
3 2 0
如果用户曾经将joinGame作为为每个用户添加的新列,我想计算joinGame之前和joinGame之后的事件数。我试过了,但是无法正常工作:
df['number_events_after_join'] = df.sort_values(by=['id','datetime'],ascending=[False, True]).assign(key=df['event_type'].eq('joinGame').astype(int)).groupby('id')['key'].cumsum()
我相信在joinGame之后返回事件数。我如何修改它以获得joinGame之前的事件数?还是有更好的方法呢?
答案 0 :(得分:0)
由于您已经拥有赛后游戏,我们只需要获得相反的顺序即可获得赛前游戏
df['number_events_before_join'] = df.sort_values(by=['id','datetime'],ascending=[False, True])\
.assign(key=df['event_type'].eq('joinGame').astype(int))\
.iloc[::-1,:].groupby('id')['key'].cumsum()
更新
s=df['event_type'].eq('joinGame').astype(int).groupby(df['id']).cumsum().gt(0)
pd.crosstab(df.id[df['event_type'].ne('joinGame')],s)
event_type False True
id
1 3 1
2 2 0
3 2 0
答案 1 :(得分:0)
有点笨拙,但是行得通。
groupby = df.groupby('id')
mask = df['event_type'].ne('joinGame')
result = pd.concat([
groupby.cumcount(ascending=1).rename('number_events_before_join'),
groupby.cumcount(ascending=0).rename('number_events_after_join')
], axis=1).mask(mask).join(df['id']).groupby('id').first().fillna(0).astype(int)
print(result)
输出:
number_events_before_join number_events_after_join
id
1 3 1
2 0 0
3 2 0