Pandas按条件合并DataFrame分组下连续两行的实现方法
Pandas 相邻ON/OFF状态行配对合并方案
需求说明
现有如下原始DataFrame:
id group sensor sdate stime status 0 US-2222 BUTTON LA-1212 2022-06-21 11:00:00 ON 1 US-2222 BUTTON LA-1212 2202-06-21 11:30:00 OFF 2 US-6666 BUTTON LA-4545 2022-06-21 06:00:00 ON 3 US-6666 BUTTON LA-4545 2022-06-21 06:30:00 OFF 4 US-6666 MOTION LA-4545 2022-06-21 09:00:00 ON 5 US-6666 MOTION LA-4545 2022-06-21 09:20:00 OFF 6 US-6666 MOTION LA-4545 2022-06-21 18:00:00 ON
需要按id、group、sensor维度分组,将连续紧邻的ON状态行与其后第一条OFF状态行合并为单行:
- 保留ON行的全部原始字段
- 新增
stime2、status2字段存储对应OFF行的时间、状态值 - 无后续OFF配对的ON行直接丢弃
期望输出结果如下:
id group sensor sdate stime status stime2 status2 0 US-2222 BUTTON LA-1212 2022-06-21 11:00:00 ON 11:30:00 OFF 2 US-6666 BUTTON LA-4545 2022-06-21 06:00:00 ON 06:30:00 OFF 4 US-6666 MOTION LA-4545 2022-06-21 09:00:00 ON 09:20:00 OFF
实现代码
核心思路是通过groupby+shift(-1)取同分组内下一行的状态和时间,筛选出「当前为ON、下一行紧邻为OFF」的有效配对行即可,无需复杂循环:
import pandas as pd # 构造原始数据集 df = pd.DataFrame( [ ["US-2222", "BUTTON", "LA-1212", "2022-06-21", "11:00:00", "ON"], ["US-2222", "BUTTON", "LA-1212", "2202-06-21", "11:30:00", "OFF"], ["US-6666", "BUTTON", "LA-4545", "2022-06-21", "06:00:00", "ON"], ["US-6666", "BUTTON", "LA-4545", "2022-06-21", "06:30:00", "OFF"], ["US-6666", "MOTION", "LA-4545", "2022-06-21", "09:00:00", "ON"], ["US-6666", "MOTION", "LA-4545", "2022-06-21", "09:20:00", "OFF"], ["US-6666", "MOTION", "LA-4545", "2022-06-21", "18:00:00", "ON"] ], columns=["id", "group", "sensor", "sdate", "stime", "status"] ) # 取同分组内下一行的时间、状态,用于配对 df["stime2"] = df.groupby(["id", "group", "sensor"])["stime"].shift(-1) df["status2"] = df.groupby(["id", "group", "sensor"])["status"].shift(-1) # 筛选配对成功的行,整理字段顺序 result = df[ (df["status"] == "ON") & (df["status2"] == "OFF") ][["id", "group", "sensor", "sdate", "stime", "status", "stime2", "status2"]] print(result)
运行上述代码即可得到和期望完全一致的输出。
注:原始数据中索引为1的OFF行sdate存在笔误(写为2202-06-21),由于逻辑中保留的是ON行的sdate字段,该笔误不会影响最终输出结果,若需修正原始数据可单独处理。
内容的提问来源于stack exchange,提问作者AB Code
相关产品推荐
相关产品推荐

