【问题标题】:Python delete all rows between the first view and the first click?Python删除第一个视图和第一次点击之间的所有行?
【发布时间】:2019-03-14 22:29:05
【问题描述】:

所以我一直在尝试失败并希望得到一些帮助。我想做的是

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

在某些情况下,我们正在收集数据,但由于观看次数计算方式出现错误,每个新会话都会在会话开始时创建大量额外观看次数。

因此,出于这个原因,我们希望在点击之前删除所有视图,除了第一个视图。如果特定用户没有点击,那么唯一剩下的应该是第一个视图。不过,在第一次点击之后,视图就被正确收集了,所以我们想保留这些。

所以如果输入如下(使用整数作为时间戳更容易)

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

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

【问题讨论】:

    标签: python pandas dataframe timestamp


    【解决方案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
    

    【讨论】:

    • 谢谢,刚刚试了一下,效果很好!我要解决的下一个问题是弄清楚会话粒度是如何工作的,每个用户都有按会话分组的活动,但我认为放入单个请求会太多。
    • 再次感谢,我能够以您的代码为基础找到其他问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多