Сброс ранга при повторении вхождения - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь найти ранг определенного события, группировать по пользователю и на основе даты, когда оно происходит, но для сброса ранга каждый раз, когда событие повторяется.

Для иллюстрации:Я хочу получить ранг в столбце rank_i_want (но мне удается получить ранг только в столбце rank_i_get, где ранг «продолжается», когда событие повторяется).В столбце rank_i_want ранг возвращается к 1, когда событие снова происходит для этого пользователя:

    date        food    name    rank_i_get  rank_i_want
0   2018-06-01  pizza   Mary    1           1
1   2018-06-02  pizza   Mary    2           2
2   2018-06-03  burger  Mary    1           1
3   2018-06-04  burger  Mary    2           2
4   2018-06-05  pizza   Mary    3           1
5   2018-06-06  burger  Mary    3           1
6   2018-06-03  pizza   Bob     1           1
7   2018-06-04  burger  Bob     1           1
8   2018-06-05  burger  Bob     2           2
9   2018-06-05  pizza   Bob     2           1

Это то, что я пробовал до сих пор (что приводит к rank_i_get в таблицевыше):

a = pd.DataFrame({
        'name': ['Mary', 'Mary', 'Mary', 'Mary', 'Mary', 'Mary', 'Bob' ,'Bob' ,'Bob', 'Bob'],
        'date': ['2018-06-01', '2018-06-02', '2018-06-03', '2018-06-04', '2018-06-05', '2018-06-06', '2018-06-03', '2018-06-04', '2018-06-05', '2018-06-05'], 
        'food': ['pizza', 'pizza', 'burger', 'burger', 'pizza', 'burger', 'pizza', 'burger', 'burger', 'pizza']})

a['rank_i_get'] = a.groupby(['name', 'food'])['date'].rank()

1 Ответ

0 голосов
/ 05 июня 2018

Создать новый Series путем сравнения shift d объединить столбцы с ne (!=) и добавить cumsum для последовательныхгруппы Series:

a['date'] = pd.to_datetime(a['date'])

s = a['name'] + '_' + a['food']
a['r'] = a.groupby(s.ne(s.shift()).cumsum())['date'].rank().astype(int)

Или:

a['r'] = a.groupby(s.ne(s.shift()).cumsum())['date'].cumcount().add(1)

print (a)
   name       date    food  r
0  Mary 2018-06-01   pizza  1
1  Mary 2018-06-02   pizza  2
2  Mary 2018-06-03  burger  1
3  Mary 2018-06-04  burger  2
4  Mary 2018-06-05   pizza  1
5  Mary 2018-06-06  burger  1
6   Bob 2018-06-03   pizza  1
7   Bob 2018-06-04  burger  1
8   Bob 2018-06-05  burger  2
9   Bob 2018-06-05   pizza  1

Деталь :

print (s.ne(s.shift()).cumsum())
0    1
1    1
2    2
3    2
4    3
5    4
6    5
7    6
8    6
9    7
dtype: int32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...