如何按Id分组,基于时间因素对类别事件分配固定排名
解决方案
可以通过Pandas的分组、聚合和排名功能实现需求,具体步骤如下:
步骤1:准备数据并转换时间格式
首先确保时间列是可排序的datetime类型,避免因字符串格式导致排序错误:
import pandas as pd # 示例数据(和你提供的一致) data = { 'Id': [1,1,1,1,1,1,1,2,2,2,2,2], 'Event': ['event1','event2','event3','event4','event5','event4','event3','event1','event2','event3','event5','event2'], 'Time(DD/MM/YYYY HH:MM:SS)': ['4/20/2022 1:09:47 AM','4/20/2022 1:12:23 AM','4/20/2022 1:13:35 AM','4/20/2022 1:13:36 AM','4/20/2022 1:13:37 AM','4/20/2022 1:15:17 AM','4/20/2022 5:56:35 AM','4/26/2022 11:19:00 AM','4/26/2022 11:20:05 AM','4/26/2022 11:20:46 AM','4/26/2022 11:20:50 AM','4/26/2022 11:21:50 AM'] } df = pd.DataFrame(data) # 转换时间列为datetime类型(匹配你标注的DD/MM/YYYY格式) df['Time'] = pd.to_datetime(df['Time(DD/MM/YYYY HH:MM:SS)'], format='%d/%m/%Y %I:%M:%S %p')
步骤2:计算每个事件的首次出现排名
通过分组聚合获取每个Id下各事件的首次出现时间,再基于这个时间分配排名:
# 按Id和Event分组,提取每个事件的首次出现时间 event_first_occurrence = df.groupby(['Id', 'Event'])['Time'].min().reset_index() # 按Id分组,对每个组内的事件按首次出现时间排序,分配从1开始的整数排名 event_first_occurrence['Output'] = event_first_occurrence.groupby('Id')['Time'].rank(method='first', ascending=True).astype(int) # 将排名映射回原DataFrame df = df.merge(event_first_occurrence[['Id', 'Event', 'Output']], on=['Id', 'Event'], how='left') # 恢复原列顺序(可选) df = df[['Id', 'Event', 'Time(DD/MM/YYYY HH:MM:SS)', 'Output']]
结果说明
执行后得到的df会和你提供的示例输出完全一致:
- 每个Id内的事件按首次出现的时间顺序分配排名,从1开始递增
- 同一Id下的重复事件会沿用首次分配的排名
- 不同Id的排名独立计算(比如两个Id的event1都排1)
内容的提问来源于stack exchange,提问作者Data-7scientist
相关产品推荐
相关产品推荐

