计算一个值组之前在熊猫数据框中的另一列的行数

时间:2019-08-13 22:53:06

标签: python pandas dataframe

我有一个如下所示的熊猫数据框:

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之前的事件数?还是有更好的方法呢?

2 个答案:

答案 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