如何删除重复流程中间数据,仅保留分组首个start和最后end对应时间戳
实现方法
你可以通过Pandas的分组筛选+结果拼接逻辑实现需求,核心是按Id分组后分别提取首个start记录、末尾end记录再合并,具体操作如下:
首先确保timestamp列转换为时间类型,避免后续筛选排序出现异常:
import pandas as pd # 构造示例数据,实际使用时替换为你自己的DataFrame即可 data = { "Id": [1, 1, 1, 1], "activity": ["start", "end", "start", "end"], "sequence": [1, 2, 1, 2], "timestamp": pd.to_datetime([ "2020-06-12 09:51:42", "2020-06-12 09:51:42", "2020-06-12 09:58:52", "2020-06-12 10:12:22" ]) } df = pd.DataFrame(data) # 分组筛选目标记录 # 取每个Id对应的第一条start记录 start_part = df[df["activity"] == "start"].groupby("Id", as_index=False).first() # 取每个Id对应的最后一条end记录 end_part = df[df["activity"] == "end"].groupby("Id", as_index=False).last() # 合并两部分结果,按Id、sequence排序得到最终输出 result = pd.concat([start_part, end_part], ignore_index=True).sort_values(by=["Id", "sequence"])
如果你需要end行的时间和你给出的示例输出一致(取对应Id下最新的start时间),可以在上述逻辑基础上调整end部分的时间赋值:
# 计算每个Id的最大start时间 max_start = df[df["activity"] == "start"].groupby("Id")["timestamp"].max().reset_index() # 替换end部分的timestamp字段 end_part = end_part.merge(max_start, on="Id", suffixes=("", "_tmp")) end_part["timestamp"] = end_part["timestamp_tmp"] end_part = end_part.drop("timestamp_tmp", axis=1)
内容的提问来源于stack exchange,提问作者Alde Joshua Wibowo
相关产品推荐
相关产品推荐

