首页 > 解决方案 > 重复出现时重置排名

问题描述

我正在尝试查找特定事件的排名,按用户分组,并根据它发生的日期,但每次事件重复时都会重置排名。

为了说明,我想获得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()

标签: pythonpandas

解决方案


通过将合并的列与( )Series进行比较来创建新的,并为连续的组添加:shiftne!=cumsumSeries

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

推荐阅读