You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas分组处理:用最新事件覆盖重叠的二进制事件列

解决Pandas事件重叠消除问题

需求说明

现有含id(分组ID)、t(时间)、A/B/C(事件列,1表示事件发生,0表示未发生)的DataFrame,需按id分组处理:当有新事件启动时,将旧事件的1替换为0,确保每行A/B/C列之和不超过1。

实现思路

核心逻辑是按分组跟踪每个事件的首次启动时间,每个时间点只保留启动时间最晚的事件,自动覆盖旧事件以消除重叠。

代码实现

1. 准备示例数据

import pandas as pd
import numpy as np

# 示例输入数据
df = pd.DataFrame({
    'id': [1,1,1,1,2,2,2],
    't': [1,2,3,4,1,2,3],
    'A': [1,1,1,1,0,1,1],
    'B': [0,1,1,0,1,1,0],
    'C': [0,0,1,1,0,0,1]
})

2. 分组处理函数(向量化版,效率更高)

def resolve_overlap(group):
    # 确保分组内按时间排序
    group = group.sort_values('t').reset_index(drop=True)
    
    # 获取每个事件的首次启动时间(未启动的设为无穷大)
    event_starts = {}
    for col in ['A', 'B', 'C']:
        first_occur = group[group[col] == 1]['t'].min()
        event_starts[col] = first_occur if not pd.isna(first_occur) else np.inf
    
    # 构建启动时间矩阵,标记每个时间点已激活的事件
    starts_df = pd.DataFrame(event_starts, index=group.index)
    activated = starts_df <= group['t'].values.reshape(-1, 1)
    
    # 对每行筛选已激活事件,取启动时间最晚的事件
    starts_masked = starts_df.where(activated, np.nan)
    group['latest_event'] = starts_masked.idxmax(axis=1)
    
    # 重置事件列:仅保留最新事件为1,其余为0
    for col in ['A', 'B', 'C']:
        group[col] = (group['latest_event'] == col).astype(int)
    
    return group.drop('latest_event', axis=1)

3. 应用到整个DataFrame

result = df.groupby('id').apply(resolve_overlap).reset_index(drop=True)

4. 输出结果

处理后的DataFrame如下:

idtABC
11100
12010
13001
14001
21010
22010
23001

补充说明

  • 如果存在多个事件同一时间首次启动,可自定义优先级选择,比如按A>B>C的顺序:
    将group['latest_event'] = starts_masked.idxmax(axis=1)替换为:
    # 自定义优先级,给高优先级事件的启动时间加微小权重
    priority = {'A':0, 'B':1, 'C':2}
    weighted_starts = starts_masked.apply(lambda x: x + [priority[col]/100 for col in x.index], axis=1)
    group['latest_event'] = weighted_starts.idxmax(axis=1)
    

内容的提问来源于stack exchange,提问作者IJN81

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:17:28