Python:将函数应用于groupby

Python:将函数应用于groupby,python,pandas,group-by,apply,Python,Pandas,Group By,Apply,我在表单中有一些数据帧 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:

我在表单中有一些数据帧

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
我想对每个组应用一个函数(按
userid
分组)。它统计用户再次经历他们遇到的相同事件的次数。例如,用户A在2017-03-01 11:23:43重新体验了
E1

 userid   |  activity | cnt_previous_events
    A           E1             0
    A           E2             0
    A           E1             1   
    A           E6             0
我尝试了以下方法:

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
并将以下内容应用于我的dataframe列

df.groupby('userid').activity.agg(previous_event_ctr)
但是我一直得到一个
类型错误:“Series”对象是可变的,因此它们不能被散列
。我应该如何使用
groupby

将此函数应用于我的数据帧您似乎需要,
df
必须首先按
userid
event\u 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

对于这个问题,我可能提供了一个糟糕的例子。这几乎就是我想要的,但我想本质上是一个独立的累积计数,还想改变我的函数来做一个滚动窗口独立计数。没问题,你能添加更好的样本吗?经过一点思考,我已经找到了一个正确的解决办法,但我解决的问题比问题描述的要复杂得多。所以我恐怕帮不了你更好的忙(