Pandas如何将相邻相同状态的时序DataFrame进行扁平化压缩处理
实现方案
核心逻辑是为连续相同的state生成统一的分组标识,再分组聚合取对应字段即可完成合并,完整代码如下:
import pandas as pd # 构造原始数据,若你已经生成带time_end的df可跳过这部分 d = {'time': ['12-08-2020', '13-08-2020', '14-08-2020', '15-08-2020', '16-08-2020'], 'state': ['off', 'on', 'on', 'on', 'off']} df = pd.DataFrame(data=d) # 生成time_end列,为你已经完成的步骤 df['time_end'] = df['time'].shift(-1) # 生成连续相同state的分组标识 df['group'] = (df['state'] != df['state'].shift()).cumsum() # 分组聚合得到最终结果 result = df.groupby('group', as_index=False).agg( time = ('time', 'first'), state = ('state', 'first'), time_end = ('time_end', 'last') ).drop('group', axis=1) print(result)
运行后输出的结果和你要求的完全一致:
time state time_end 0 12-08-2020 off 13-08-2020 1 13-08-2020 on 16-08-2020 2 16-08-2020 off NaN
逻辑说明
df['state'] != df['state'].shift()会生成布尔序列,当前行状态和上一行不一致时返回True,cumsum()对布尔值累加(True计为1,False计为0),所有连续相同的state会被分到同一个分组ID下,分组后取每组第一个time作为状态起始时间,每组最后一个time_end作为状态结束时间即可完成合并。
内容的提问来源于stack exchange,提问作者ajay1738
相关产品推荐
相关产品推荐

