您的当前位置:首页正文

dataframe 模仿sql实现窗口函数功能 lead lag dataframe groupy 实现窗口函数

2024-11-09 来源:个人技术集锦

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)]

本方法并不严格,第二个工单的首行会匹配到第一个末行。

Top