Pandas实现列中连续1之间符合阈值要求的间隔0替换方法
实现方案
核心思路是先对列A的连续值做分组,标记出所有连续0的区间,再校验区间前后的连续1长度是否符合要求,满足条件的0区间直接替换为1即可,完整实现代码如下:
import pandas as pd # 初始化数据 df = pd.DataFrame({'A': [1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]}) n = 8 max_gap = 4 # 生成连续值分组ID df['group_id'] = df['A'].diff().ne(0).cumsum() # 计算每个分组的数值、长度 group_info = df.groupby('group_id')['A'].agg(val='first', cnt='count').reset_index() # 初始化Fill_Gap列为原A列的值 df['Fill_Gap'] = df['A'].copy() # 遍历所有0值分组,校验前后1分组是否符合条件 for i in range(1, len(group_info)-1): curr_group = group_info.iloc[i] prev_group = group_info.iloc[i-1] next_group = group_info.iloc[i+1] # 仅处理0值的中间分组 if curr_group['val'] == 0 and prev_group['val'] == 1 and next_group['val'] == 1: # 校验前后1长度≥n,且当前0长度≤max_gap if prev_group['cnt'] >=n and next_group['cnt'] >=n and curr_group['cnt'] <= max_gap: # 替换对应位置的Fill_Gap为1 df.loc[df['group_id'] == curr_group['group_id'], 'Fill_Gap'] = 1 # 可选:删除辅助用的group_id列 df.drop('group_id', axis=1, inplace=True)
运行后得到的Fill_Gap列和你给出的预期输出完全一致,仅索引13-16的4个0会被替换为1。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

