Python удалить все строки между первым видом и первым щелчком мыши? - PullRequest
1 голос
/ 15 марта 2019

Так что я пытался потерпеть неудачу и надеюсь на некоторую помощь.Я хочу

  • Группировать по пользователям и сортировать по отметке времени (именно так настроен нижеприведенный кадр данных)
  • Теперь я хочу просмотреть все просмотры допервый щелчок и сгруппируйте его в одно событие с самой ранней отметкой времени
    • . Или же удалите все, что находится между первым просмотром и первым щелчком *
  • Если у них нет щелчкови только представления, все строки должны быть сведены в одну строку

Для некоторого контекста мы собираем данные, но из-за ошибки в том, как подсчитываются представления, каждый новый сеанс создает большое количестводополнительные просмотры в начале сеанса.

Поэтому по этой причине мы хотим избавиться от всех представлений до щелчка, кроме самого первого представления.Если для определенного пользователя щелчка нет, то единственное, что остается, - это самый первый просмотр.Однако после первого щелчка представления собраны правильно, поэтому мы хотим оставить их как есть.

Так что, если ввод является следующим (использование целых чисел для отметки времени, чтобы упростить)

import pandasкак 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 Ответ

1 голос
/ 15 марта 2019

Выполните следующие шаги

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

Здесь мы делаем настройку для единственного идентификатора, имеющего представление

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...