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

基于事件发生与清除的DataFrame高效重塑方案咨询

高效重塑事件状态DataFrame的方法

需求背景

处理制表符分隔的CSV事件数据,每条记录含时间戳、事件状态(State:TRUE=事件发生,FALSE=事件清除)、事件代码及其他元数据。每个事件代码可多次触发与清除,且每次发生后必有对应的清除事件。此前逐行迭代处理效率极低,需高效解决方案。

输入数据示例

Timestamp                   State   Data    EventCode   EventMsg            Class
19-May-2023 16:10:09.301    FALSE   1       EventCode 1 EventCode 1 Message class 1
19-May-2023 16:10:09.300    FALSE   2       EventCode 2 EventCode 2 Message class 1
19-May-2023 16:10:09.299    TRUE    3       EventCode 1 EventCode 1 Message class 2
19-May-2023 16:10:09.298    FALSE   4       EventCode 4 EventCode 4 Message class 2
19-May-2023 16:10:09.297    FALSE   5       EventCode 3 EventCode 3 Message class 2
19-May-2023 16:10:09.296    TRUE    6       EventCode 2 EventCode 2 Message class 1
19-May-2023 16:10:09.295    TRUE    7       EventCode 4 EventCode 4 Message class 2
19-May-2023 16:10:09.294    TRUE    8       EventCode 3 EventCode 3 Message class 2
19-May-2023 16:10:09.293    FALSE   0       EventCode 1 EventCode 1 Message class 2
19-May-2023 16:10:09.292    TRUE    9       EventCode 1 EventCode 1 Message class 2

期望输出格式

OccurTimestamp              clearTimestamp          Data    EventCode   EventMsg            Class
19-05-2023 16:10:09.299     19-05-2023 16:10:09.301 3       EventCode 1 EventCode 1 Message class 1
19-05-2023 16:10:09.296     19-05-2023 16:10:09.300 6       EventCode 2 EventCode 2 Message class 1
19-05-2023 16:10:09.295     19-05-2023 16:10:09.298 7       EventCode 4 EventCode 3 Message class 2
19-05-2023 16:10:09.294     19-05-2023 16:10:09.297 8       EventCode 3 EventCode 4 Message class 2
19-05-2023 16:10:09.292     19-05-2023 16:10:09.293 9       EventCode 1 EventCode 1 Message class 1

高效解决方案(基于Pandas矢量化操作)

利用Pandas的分组、排序和透视表功能,完全避免逐行迭代,处理效率大幅提升:

  1. 读取并预处理数据

    import pandas as pd
    
    # 读取制表符分隔的CSV,解析时间戳列
    df = pd.read_csv('your_file.csv', sep='\t', parse_dates=['Timestamp'], dayfirst=True)
    
  2. 按事件代码分组并排序
    确保每组内的事件按时间顺序排列,保证发生事件(TRUE)在清除事件(FALSE)之前:

    df_sorted = df.sort_values(['EventCode', 'Timestamp'])
    
  3. 为每对事件分配配对ID
    对每个事件代码组内的记录按顺序每两条分配一个ID,实现发生与清除事件的配对:

    df_sorted['pair_id'] = df_sorted.groupby('EventCode').cumcount() // 2
    
  4. 重塑数据结构
    通过透视表将配对的发生/清除事件合并为一行:

    # 透视表聚合,提取每对事件的对应字段
    result = df_sorted.pivot_table(
        index=['EventCode', 'pair_id'],
        columns='State',
        values=['Timestamp', 'Data', 'EventMsg', 'Class'],
        aggfunc='first'
    ).reset_index()
    
    # 整理列名,合并层级并重命名
    result.columns = ['_'.join(col).strip() if col[1] else col[0] for col in result.columns.values]
    result = result.rename(columns={
        'Timestamp_TRUE': 'OccurTimestamp',
        'Timestamp_FALSE': 'clearTimestamp',
        'Data_TRUE': 'Data',
        'EventMsg_TRUE': 'EventMsg',
        'Class_TRUE': 'Class'
    })
    
  5. 调整输出格式与排序
    保留需要的列,按发生时间排序,并格式化时间戳为目标格式:

    # 筛选目标列
    result = result[['OccurTimestamp', 'clearTimestamp', 'Data', 'EventCode', 'EventMsg', 'Class']]
    # 按发生时间降序排列,匹配示例顺序
    result = result.sort_values('OccurTimestamp', ascending=False)
    # 格式化时间戳为dd-mm-yyyy HH:MM:SS.sss格式
    result['OccurTimestamp'] = result['OccurTimestamp'].dt.strftime('%d-%m-%Y %H:%M:%S.%f')[:-3]
    result['clearTimestamp'] = result['clearTimestamp'].dt.strftime('%d-%m-%Y %H:%M:%S.%f')[:-3]
    
  6. 查看结果

    print(result)
    

效率说明

上述方法全部采用Pandas底层优化的矢量化操作,避免了Python层面的循环遍历,处理百万级数据时速度比逐行迭代快数十倍甚至上百倍。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:40:36