Python:将函数应用于 groupby

Bla*_*ack 3 python group-by apply pandas

我在表单中有一些数据框

userid |      event_time      | activity
   A      2017-01-01 02:20:34      E1
   A      2017-01-01 02:20:50      E2     
   A      2017-03-01 11:23:43      E1                
   A      2017-03-01 11:23:55      E6
   B      2017-01-01 08:24:32      E1                
   B      2017-01-01 08:25:25      E4
   C      2017-01-01 23:19:21      E3                
   C      2017-01-01 23:20:04      E11
Run Code Online (Sandbox Code Playgroud)

我想对每个组应用一个函数(按 分组userid)。这计算了用户重新体验他们遇到的同一事件的次数。例如,用户 A 重新体验E12017-03-01 11:23:43

 userid   |  activity | cnt_previous_events
    A           E1             0
    A           E2             0
    A           E1             1   
    A           E6             0
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

def previous_event_ctr(group):

    events = set()
    ctr = 0

    for val in group:
        if val in events:
           ctr += 1
        else:
           events.add(val)

    return ctr
Run Code Online (Sandbox Code Playgroud)

并将以下内容应用于我的数据框列,

df.groupby('userid').activity.agg(previous_event_ctr)
Run Code Online (Sandbox Code Playgroud)

但我不断收到TypeError: 'Series' objects are mutable, thus they cannot be hashed. 我应该如何使用groupby.

jez*_*ael 5

看来您需要cumcount,df必须按useridevent_time首先排序:

df['count'] = df.sort_values(['userid','event_time'])
                .groupby(['userid', 'activity']).activity.cumcount()
print (df)

  userid           event_time activity  count
0      A  2017-01-01 02:20:34       E1      0
1      A  2017-01-01 02:20:50       E2      0
2      A  2017-03-01 11:23:43       E1      1
3      A  2017-03-01 11:23:55       E6      0
4      B  2017-01-01 08:24:32       E1      0
5      B  2017-01-01 08:25:25       E4      0
6      C  2017-01-01 23:19:21       E3      0
7      C  2017-01-01 23:20:04      E11      0
Run Code Online (Sandbox Code Playgroud)