Панды сгруппированы по двум столбцам и ведут записи только в соответствии с условиями, основанными на количестве - PullRequest
0 голосов
/ 14 мая 2018

Попытка отфильтровать ряд действий, выполненных пользователем, если количество действий достигает порогового значения.

Вот набор данных: (Только несколько записей)

user_id,session_id,item_id,rating,length,time
123,36,28,3.5,6243.0,2015-03-07 22:44:40
123,36,29,2.5,4884.0,2015-03-07 22:44:14
123,36,30,3.5,6846.0,2015-03-07 22:44:28
123,36,54,6.5,10281.0,2015-03-07 22:43:56
123,36,61,3.5,7639.0,2015-03-07 22:43:44
123,36,62,7.5,18640.0,2015-03-07 22:43:34
123,36,63,8.5,7189.0,2015-03-07 22:44:06
123,36,97,2.5,7627.0,2015-03-07 22:42:53
123,36,98,4.5,9000.0,2015-03-07 22:43:04
123,36,99,7.5,7514.0,2015-03-07 22:43:13
223,63,30,8.0,5412.0,2015-03-22 01:42:10
123,36,30,5.5,8046.0,2015-03-07 22:42:05
223,63,32,8.5,4872.0,2015-03-22 01:42:03
123,36,32,7.5,11914.0,2015-03-07 22:41:54
225,63,35,7.5,6491.0,2015-03-22 01:42:19
123,36,35,5.5,7202.0,2015-03-07 22:42:15
123,36,36,6.5,6806.0,2015-03-07 22:42:43
123,36,37,2.5,6810.0,2015-03-07 22:42:34
225,63,41,5.0,15026.0,2015-03-22 01:42:37
225,63,45,6.5,8532.0,2015-03-07 22:42:25

Я могу groupby данные, используя user_id и session_id и получить count элементов впользователь оценил в сеансе:

df.groupby(['user_id', 'session_id']).agg({'item_id':'count'}).rename(columns={'item_id': 'count'})

Список предметов, которые пользователь оценил в сеансе, может быть получен:

df.groupby(['user_id','session_id'])['item_id'].apply(list)

Цель состоит в том, чтобы получитьследуя, если пользователь оценил более 3 элементов в сеансе, я хочу выбрать только первые три элемента (оставить только первые три элемента на пользователя в сеансе) из исходного фрейма данных.Может быть, использовать время для сортировки элементов?

Сначала попытался выяснить, какие сеансы содержат более 3, несколько пытаясь выйти за рамки.

df.groupby(['user_id', 'session_id'])['item_id'].apply(
            lambda x: (x > 3).count())

Пример: из исходного df, пользователь 123 первые три записи должны принадлежать сеансу 36

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Одним из способов является использование sort_values, за которым следует groupby.cumcount.Метод, который я считаю полезным, состоит в том, чтобы извлечь любую серию или данные MultiIndex перед применением какой-либо фильтрации.

В приведенном ниже примере выполняется фильтрация для минимальной комбинации user_id / session_id из 3 элементов, и для каждой из трех групп используются только первые 3.

sizes = df.groupby(['user_id', 'session_id']).size()
counter = df.groupby(['user_id', 'session_id']).cumcount() + 1  # counting begins at 0
indices = df.set_index(['user_id', 'session_id']).index

df = df.sort_values('time')
res = df[(indices.map(sizes.get) >= 3) & (counter <=3)]

print(res)

    user_id  session_id  item_id  rating   length                 time
0       123          36       28     3.5   6243.0  2015-03-07 22:44:40
1       123          36       29     2.5   4884.0  2015-03-07 22:44:14
2       123          36       30     3.5   6846.0  2015-03-07 22:44:28
14      225          63       35     7.5   6491.0  2015-03-22 01:42:19
18      225          63       41     5.0  15026.0  2015-03-22 01:42:37
19      225          63       45     6.5   8532.0  2015-03-07 22:42:25
0 голосов
/ 14 мая 2018

Похоже, вы хотите использовать groupby с head:

In [8]: df.groupby([df.user_id, df.session_id]).head(3)
Out[8]:
    user_id  session_id  item_id  rating   length                 time
0       123          36       28     3.5   6243.0  2015-03-07 22:44:40
1       123          36       29     2.5   4884.0  2015-03-07 22:44:14
2       123          36       30     3.5   6846.0  2015-03-07 22:44:28
10      223          63       30     8.0   5412.0  2015-03-22 01:42:10
12      223          63       32     8.5   4872.0  2015-03-22 01:42:03
14      225          63       35     7.5   6491.0  2015-03-22 01:42:19
18      225          63       41     5.0  15026.0  2015-03-22 01:42:37
19      225          63       45     6.5   8532.0  2015-03-07 22:42:25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...