所以我一直在尝试失败,希望能有所帮助。我想做的是
在某些情况下,我们正在收集数据,但是由于视图计数方式存在错误,每个新会话在会话开始时都会创建大量额外的视图。
因此,出于这个原因,我们希望在单击之前除去所有视图,但第一个视图除外。如果没有特定用户的点击,则剩下的唯一内容应该是第一个视图。第一次单击后,视图将被正确收集,因此我们希望保留这些视图。
因此,如果输入为以下内容(使用整数作为时间戳记会更容易)
将熊猫作为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)
如果任何人有任何想法如何解决,将不胜感激!
答案 0 :(得分:1)
按照以下步骤
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