如何删除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
相关产品推荐
相关产品推荐

