基于事件发生与清除的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的分组、排序和透视表功能,完全避免逐行迭代,处理效率大幅提升:
读取并预处理数据
import pandas as pd # 读取制表符分隔的CSV,解析时间戳列 df = pd.read_csv('your_file.csv', sep='\t', parse_dates=['Timestamp'], dayfirst=True)按事件代码分组并排序
确保每组内的事件按时间顺序排列,保证发生事件(TRUE)在清除事件(FALSE)之前:df_sorted = df.sort_values(['EventCode', 'Timestamp'])为每对事件分配配对ID
对每个事件代码组内的记录按顺序每两条分配一个ID,实现发生与清除事件的配对:df_sorted['pair_id'] = df_sorted.groupby('EventCode').cumcount() // 2重塑数据结构
通过透视表将配对的发生/清除事件合并为一行:# 透视表聚合,提取每对事件的对应字段 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' })调整输出格式与排序
保留需要的列,按发生时间排序,并格式化时间戳为目标格式:# 筛选目标列 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]查看结果
print(result)
效率说明
上述方法全部采用Pandas底层优化的矢量化操作,避免了Python层面的循环遍历,处理百万级数据时速度比逐行迭代快数十倍甚至上百倍。
内容的提问来源于stack exchange,提问作者Hannibal
相关产品推荐
相关产品推荐

