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