Pandas实现两个时间序列按相同ID分组按日期排序展示事件列表
实现方案
核心思路是先把两个异构的事件表标准化为同结构的长表,再合并后按人分组排序聚合,具体实现如下:
前置依赖
需要用到pandas库,没有安装的话先执行pip install pandas
完整代码
import pandas as pd # 示例数据构造,实际使用时替换成你自己的df_a、df_b读入逻辑 df_a = pd.DataFrame({ 'Person_Id': ['ID1', 'ID1', 'ID2', 'ID3'], 'Event_A_Date': ['2023-01-01', '2023-01-03', '2023-01-02', '2023-01-01'], 'A_Reason': ['X_A', 'Y_A', 'X_A', 'Z_A'] }) df_b = pd.DataFrame({ 'Person Id': ['ID1', 'ID2', 'ID2', 'ID3'], 'Event_B_Date': ['2023-01-05', '2023-01-04', '2023-01-03', '2023-01-02'], 'B_Reason': ['Z_B', 'Z_A', 'Y_B', 'X_B'] }) # 1. 预处理表A df_a_processed = df_a.rename(columns={ 'Event_A_Date': 'event_date', 'A_Reason': 'reason' })[['Person_Id', 'event_date', 'reason']] # 2. 预处理表B:先统一Person_Id字段名 df_b_processed = df_b.rename(columns={ 'Person Id': 'Person_Id', 'Event_B_Date': 'event_date', 'B_Reason': 'reason' })[['Person_Id', 'event_date', 'reason']] # 3. 合并两个事件表 df_all = pd.concat([df_a_processed, df_b_processed], ignore_index=True) # 4. 转换日期格式,避免字符串排序出错 df_all['event_date'] = pd.to_datetime(df_all['event_date']) # 5. 分组排序聚合:按Person_Id分组,组内按日期升序排序后聚合成列表 # 如果同一天有A/B两个事件,要指定顺序的话可以在sort_values里加第二关键字,比如加个来源字段排序 df_result = df_all.sort_values(by='event_date') \ .groupby('Person_Id')['reason'] \ .agg(list) \ .reset_index(name='Event_sequence') # 输出结果 print(df_result)
输出示例
运行上述代码得到的结果和预期样例完全一致:
| Person_Id | Event_sequence |
|---|---|
| ID1 | [X_A, Y_A, Z_B] |
| ID2 | [X_A, Y_B, Z_A] |
| ID3 | [Z_A, X_B] |
注意事项
- 如果需要处理同一天的事件排序,可以在预处理阶段给A、B表各加一个
event_type字段,排序时加by=['event_date', 'event_type']即可自定义同日期下的先后顺序 - 日期字段如果有非标准格式,
pd.to_datetime可以加format参数指定格式提升转换效率
内容的提问来源于stack exchange,提问作者AnonymousMe
相关产品推荐
相关产品推荐

