Pandas按id分组拼接lag<1秒连续行process并更新时间字段的方法
解决方案
步骤1:转换lag列为时间差类型
你的lag列目前是字符串格式,无法直接做时间长度比较,首先转成pandas的timedelta类型:
import pandas as pd import numpy as np # 你给出的原始DataFrame构造代码 data = {'process': ['buying','selling','searhicng','repairing', 'preparing', 'selling','buying', 'searching', 'selling','searching'], 'type': ['in_progress','in_progress','end','in_progress', 'end', 'in_progress','in_progress', 'end', 'in_progress','end'], 'country': ['usa',np.nan, 'usa','ghana', np.nan,'end','portugal', np.nan, np.nan,'england'], 'id': ['022','022','022', '011','011', '011','011', '011', '011','011'], 'lag': ['00:00:10.042721','00:00:00.042721','00:00:05.042721','00:10:00.042721','00:00:00.042721','00:00:00.042721','00:00:50.042721','00:00:00.042721','00:00:00.042721','00:00:00.042721'], 'created': ['2021-07-01','2021-07-02','2021-07-03','2021-07-04','2021-07-05','2021-07-06','2021-07-06','2021-07-08','2021-07-09','2021-07-10'], 'next_created': ['2021-07-01','2021-07-02','2021-07-03','2021-07-04','2021-07-05','2021-07-06','2021-07-07','2021-07-08','2021-07-09','2021-07-10'] } df = pd.DataFrame(data, columns = ['process','type','country', 'id','lag','created','next_created']) # 转换lag为时间差类型 df['lag'] = pd.to_timedelta(df['lag'])
步骤2:构造连续块的分组ID
你猜测用cumsum的思路完全正确,你提到的df['lag'].shift(1).???.cumsum()中???的核心逻辑是判断当前行的lag是否小于1秒的状态,和上一行是否不一致,每次状态变化就累加1,就能把连续同状态的行划到同一个分组:
# 先标记当前行lag是否小于1秒 df['is_less_1s'] = df['lag'] < pd.Timedelta(seconds=1) # 按id分组,状态变化时累加生成块ID df['block_id'] = df.groupby('id')['is_less_1s'].apply(lambda x: (x != x.shift()).cumsum())
步骤3:按id和块ID分组聚合
按照需求规则聚合即可:
result = df.groupby(['id', 'block_id']).agg( process = ('process', ','.join), created = ('created', 'first'), next_created = ('next_created', 'last') ).reset_index(drop=True)
最终结果示例
| process | created | next_created |
|---|---|---|
| repairing | 2021-07-04 | 2021-07-04 |
| preparing,selling | 2021-07-05 | 2021-07-06 |
| buying | 2021-07-06 | 2021-07-07 |
| searching,selling,searching | 2021-07-08 | 2021-07-10 |
| buying | 2021-07-01 | 2021-07-01 |
| selling | 2021-07-02 | 2021-07-02 |
| searhicng | 2021-07-03 | 2021-07-03 |
如果需要保留type、country等其他字段,在agg中自行添加对应聚合规则即可。
内容的提问来源于stack exchange,提问作者user15920209
相关产品推荐
相关产品推荐

