,所以我一直在尝试失败,并希望得到一些帮助。我想做的是
- 按用户组组,然后按时间戳进行排序(这是下面的数据框架设置的方式)
- 现在,我想在第一次点击之前对所有视图进行,然后将其分组为最早的时间戳
- 或者,删除第一个视图和第一个点击之间的所有内容
- 如果他们没有点击,并且只有视图,则所有行应被扁平到单行
对于某些上下文,我们正在收集数据,但是由于如何计数视图的错误,每个新的会话都会在会话开始时创建大量额外的视图。
因此,出于这个原因,我们希望在单击之前摆脱所有视图,除了第一个视图。如果特定用户没有单击,那么剩下的唯一的事情应该是第一个视图。不过,在第一次点击之后,正确收集了视图,因此我们要离开这些视图。
因此,如果输入为以下(使用时间戳的整数使其更容易)
将大熊猫作为pd
导入in = {'id': [123, 123, 123, 123, 234, 234,234, 234, 234, 234, 456, 456, 456],
'activity': ['view','view','click','click','view','view','view','click', 'view', 'click', 'view', 'view', 'view'] ,
'timestamp': [1, 2,3,4,1,2,3,4,5,6,1,2,3]}
pd.DataFrame(in)
输出应为
out = {'id': [123, 123, 123, 234, 234, 234, 234, 456],
'activity': ['view','click','click','view','click','view', 'click', 'view'] ,
'timestamp': [1, 3,4,1,4,5,6,1,]}
pd.DataFrame(out)
如果有人有任何想法,将不胜感激!
遵循以下步骤
s1=df.activity.eq('view').groupby(df['id']).transform('idxmax')
# using idxmax find the first view
s2=df.activity.eq('click').groupby(df['id']).transform('idxmax')
# same logic here find the index of first click
out=df.loc[(df.index<=s1)|(df.index>=s2)].copy()
# filter the original df by bool get from above
在这里,我们对唯一的ID进行调整
adjustonlyview=out.activity.eq('view').groupby(df['id']).transform('all')
# find those id out
idx_to_drop=out[adjustonlyview].duplicated('id')
# using duplicate find the the row we do not want to keep
idx_to_drop=idx_to_drop[idx_to_drop].index
# get the index of the row we need to drop
out.drop(idx_to_drop,axis=0,inplace=True) # drop it
Out[286]:
id activity timestamp
0 123 view 1
2 123 click 3
3 123 click 4
4 234 view 1
7 234 click 4
8 234 view 5
9 234 click 6
10 456 view 1