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

如何删除Pandas DataFrame中被错误赋值的孤立及连续On信号行

解决方案

你原有的代码存在两个核心问题:

  • 循环过程中直接调用drop修改DataFrame,会动态改变行索引和总长度,后续的loc取值会出现错位
  • 判断逻辑仅覆盖了单个On夹在Off之间的场景,没有适配连续On的情况

推荐使用pandas向量化操作实现需求,执行效率远高于循环,逻辑也更易维护:

import pandas as pd
import numpy as np

# 为连续相同的Signal值生成唯一分组ID
df['group_id'] = (df['Signal'] != df['Signal'].shift()).cumsum()

# 统计每个分组的特征
group_meta = df.groupby('group_id').agg(
    is_all_on = ('Signal', lambda x: (x == 'On').all()),
    first_idx = ('group_id', 'idxmin'),
    last_idx = ('group_id', 'idxmax')
).reset_index()

# 补充分组前后相邻行的Signal取值
group_meta['prev_signal'] = df.shift(1).loc[group_meta['first_idx'], 'Signal'].values
group_meta['next_signal'] = df.shift(-1).loc[group_meta['last_idx'], 'Signal'].values

# 筛选出需要删除的分组:全为On、前后相邻行都是Off
drop_groups = group_meta[
    group_meta['is_all_on'] &
    (group_meta['prev_signal'] == 'Off') &
    (group_meta['next_signal'] == 'Off')
]['group_id']

# 过滤掉需要删除的行,清理临时列
df = df[~df['group_id'].isin(drop_groups)].drop(columns='group_id').reset_index(drop=True)

上述代码可以覆盖所有夹在Off之间的连续On场景,不管连续On的长度是1还是更多,都会被整体删除。如果需要调整边界规则(比如删除DataFrame开头/结尾处的孤立On块),只需修改drop_groups的筛选条件即可。

内容的提问来源于stack exchange,提问作者Elgun Valiyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:54:03