Python:将函数应用于groupby

时间:2017-04-24 10:33:45

标签: 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: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在E1重新体验2017-03-01 11:23:43

 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

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

df.groupby('userid').activity.agg(previous_event_ctr)

但我一直在TypeError: 'Series' objects are mutable, thus they cannot be hashed。我应该如何使用groupby将此函数应用于我的数据框。

1 个答案:

答案 0 :(得分:4)

您似乎需要cumcountdf必须先按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