You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:21:35