如何删除DataFrame中含NoProduct的行仅保留最后一行并计算delta
实现代码
import pandas as pd # 1. 生成连续相同ProductCase的分组ID df['group_id'] = (df['ProductCase'] != df['ProductCase'].shift()).cumsum() # 2. 筛选需要保留的行:所有Product行 + 每段NoProduct组的最后一行 mask = ( (df['ProductCase'] == 'Product') | ((df['ProductCase'] == 'NoProduct') & (df.groupby('group_id').cumcount(ascending=False) == 0)) ) df_res = df[mask].copy() # 3. 重新计算delta和time字段 df_res['delta'] = df_res['timestamp'].diff() df_res['time'] = df_res['delta'].dt.total_seconds() # 4. 清理辅助列,重置索引 df_res = df_res.drop(columns='group_id').reset_index(drop=True)
步骤说明
- 分组逻辑:用
shift()对比当前行和上一行的ProductCase值,不一致时分组编号+1,即可把连续相同的记录归到同一个分组 - 筛选逻辑:对每个NoProduct分组用
cumcount(ascending=False)倒序计数,计数值为0的就是该组最后一行,直接保留即可 - 字段重算:
diff()直接计算相邻两行的时间差得到新delta,再提取总秒数赋值给time字段,结果完全匹配预期输出
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

