我试图找到特定事件的等级,按用户分组,并根据事件发生的日期,但每次重复事件时重置等级。
为了说明,我想在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()
答案 0 :(得分:0)
通过将shift
d合并的列与ne
(Series
)进行比较来创建新的!=
,并为连续的群组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