Python删除第一个视图和第一次单击之间的所有行?

时间:2019-03-14 22:29:05

标签: python pandas dataframe timestamp

所以我一直在尝试失败,希望能有所帮助。我想做的是

  • 按用户分组并按时间戳排序(这是下面的数据框的设置方式)
  • 现在,我想在首次点击之前获取所有视图,并将其分组为具有最早时间戳的单个事件
    • 或者,删除第一个视图和第一次单击之间的所有内容
  • 如果没有点击,只有视图,则应将所有行展平为单行

在某些情况下,我们正在收集数据,但是由于视图计数方式存在错误,每个新会话在会话开始时都会创建大量额外的视图。

因此,出于这个原因,我们希望在单击之前除去所有视图,但第一个视图除外。如果没有特定用户的点击,则剩下的唯一内容应该是第一个视图。第一次单击后,视图将被正确收集,因此我们希望保留这些视图。

因此,如果输入为以下内容(使用整数作为时间戳记会更容易)

将熊猫作为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)

如果任何人有任何想法如何解决,将不胜感激!

1 个答案:

答案 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