如何按日期倒序对DataFrame进行分组排名?
按用户分组对日期倒序排名的实现方法
需求:对DataFrame按user分组,同一分组内按start_time倒序排名,最新的日期对应排名1,次新对应排名2,以此类推。
示例输入数据
| user | start_time |
|---|---|
| ID | 2022-05-31 18:13:43 |
| BB | 2020-11-07 00:42:36 |
| RL | 2021-11-25 01:01:15 |
| ID | 2020-05-30 03:30:19 |
| KF | 2021-05-18 00:26:32 |
| MT | 2021-07-02 22:44:01 |
| BB | 2021-08-01 16:06:37 |
| RL | 2021-02-02 20:54:08 |
| BB | 2022-06-25 22:52:56 |
| KF | 2021-04-24 01:45:18 |
期望输出结果
| user | start_time | rank |
|---|---|---|
| ID | 2022-05-31 18:13:43 | 1 |
| BB | 2020-11-07 00:42:36 | 3 |
| RL | 2021-11-25 01:01:15 | 1 |
| ID | 2020-05-30 03:30:19 | 2 |
| KF | 2021-05-18 00:26:32 | 1 |
| MT | 2021-07-02 22:44:01 | 1 |
| BB | 2021-08-01 16:06:37 | 2 |
| RL | 2021-02-02 20:54:08 | 2 |
| BB | 2022-06-25 22:52:56 | 1 |
| KF | 2021-04-24 01:45:18 | 2 |
实现代码
import pandas as pd # 构造输入数据(实际场景可替换为读取数据的代码) data = { 'user': ['ID', 'BB', 'RL', 'ID', 'KF', 'MT', 'BB', 'RL', 'BB', 'KF'], 'start_time': ['2022-05-31 18:13:43', '2020-11-07 00:42:36', '2021-11-25 01:01:15', '2020-05-30 03:30:19', '2021-05-18 00:26:32', '2021-07-02 22:44:01', '2021-08-01 16:06:37', '2021-02-02 20:54:08', '2022-06-25 22:52:56', '2021-04-24 01:45:18'] } df = pd.DataFrame(data) # 将日期列转换为datetime类型,确保日期比较的正确性 df['start_time'] = pd.to_datetime(df['start_time']) # 按用户分组,对日期降序排序后计算排名 df['rank'] = df.sort_values(['user', 'start_time'], ascending=[True, False]) \ .groupby('user') \ .cumcount() + 1 # 恢复原数据的行顺序 df = df.sort_index() print(df)
代码说明
- 日期类型转换:将
start_time转为datetime类型,避免字符串比较导致的逻辑错误。 - 排序分组:先按
user升序、start_time降序排序,保证每个用户下最新的日期排在分组内首位。 - 计算排名:使用
groupby('user').cumcount()获取分组内的序号(从0开始),加1后得到从1开始的排名。 - 恢复原顺序:通过
sort_index()还原输入数据的行顺序,确保输出和输入的行位置一一对应。
内容的提问来源于stack exchange,提问作者figNewton
相关产品推荐
相关产品推荐

