python - 重复出现时重置排名
问题描述
我正在尝试查找特定事件的排名,按用户分组,并根据它发生的日期,但每次事件重复时都会重置排名。
为了说明,我想获得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()
解决方案
通过将合并的列与( )Series
进行比较来创建新的,并为连续的组添加:shift
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
推荐阅读
- java - 如何从 Outlook 电子邮件内容导航到正确的“URL”
- javascript - 从 Cloud Firestore 获取数据并将其存储在常量中
- node.js - 如何使用 nodemailer 设置网络表单?
- scala - Akka HTTP 路由处理
- jupyter-notebook - 在 Kaggle 中提交完成后,下载数据集/新版本选项不可用
- javascript - 如何在页面加载时发出 axios get 请求,然后用该数据渲染 am4chart?
- pytorch - 当我在多个 GPU 上运行 Pytorch Dataparallel 时,它不起作用
- python - 为什么 os.scandir() 变慢/如何重新组织巨大的目录?
- rust - rust-toolchain.toml 可以是开发环境描述符吗
- javascript - AJAX追加循环不同的字段值