发生重复时重置排名

时间:2018-06-05 10:55:31

标签: python pandas

我试图找到特定事件的等级,按用户分组,并根据事件发生的日期,但每次重复事件时重置等级。

为了说明,我想在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 :(得分:0)

通过将shift d合并的列与neSeries)进行比较来创建新的!=,并为连续的群组Series添加cumsum:< / p>

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