df:DataFrame,每个工单的操作日志表。列:工单号
, 操作时间
,操作行为代码
我想找出有哪些工单进行了操作1之后紧接着就是进行操作5
如果是在sql中,直接用lead窗口函数就行。
但是在dataframe中,需要结合groupby和sort_values、shift来实现。
# 1. 按工单和操作时间排序
df.sort_values(['工单号','操作时间'], inplace=True)
# 2. 给予每行操作一个唯一的主键
df['id'] = range(len(df))
# 3. 实现窗口函数:对order_id聚合,按照操作时间排序,然后移动窗口
a = df.grupby('order_id').apply(lambda x: x.sort_values('操作时间').shift(-1))
# 4. 得到字典 id:操作行为代码
a.index = a.id-1 # 将a的索引设为主键id,这样字典的主键就是id。id-1:因为经过shift,需要匹配上一行的行为就是id-1
dic = a['操作行为代码'].dropna().to_dict()
# 5. 通过字典获取下一个操作行为代码
df['下一个操作行为代码'] = df['id].map(dict)
# 6. 找出有哪些工单进行了操作1之后紧接着就是进行操作5
df[(df['操作行为代码']==1)&(df['操作行为代码']==5)]
本方法并不严格,第二个工单的首行会匹配到第一个末行。