Pandas:如何查找数据框任意行中相邻列连续6个0并替换为NaN?
Pandas 行内连续6个相邻0替换为NaN的实现
- 仅识别同一行内、沿列方向相邻的连续6个0构成的块,不统计跨行的连续序列
- 识别到对应块后,将块内所有值替换为NaN
- 零散的独立0、长度不足6的短段连续0不做任何修改
高效实现方案(向量化操作,适配大尺寸DataFrame)
用滚动窗口替代逐行遍历,运行速度可以提升几个数量级,核心逻辑是:先用6长度的行向滚动窗口定位连续全0的块端点,再把掩码扩散覆盖完整的连续块范围,最后按掩码替换值。
可直接运行的代码:
import pandas as pd import numpy as np # 替换为实际业务中的DataFrame即可 df = pd.DataFrame([ [0,0,0,0,0,0, 1, 2], # 前6个为连续0,触发替换 [0,1,0,0,0,0,0,0], # 索引2-7列共6个连续0,触发替换 [0,0,0,0,0, 3, 0,0] # 仅5个连续0,不触发替换 ]) # 标记所有值为0的位置 is_zero = (df == 0) # 沿列方向做6长度的滚动窗口,判断窗口内是否全为0 # 判定结果会对齐在窗口最右侧的列位置 window_match = is_zero.rolling(window=6, axis=1).all() # 向左扩散掩码,补全每个匹配块的完整6个列范围 replace_mask = window_match.copy() for step in range(1, 6): replace_mask = replace_mask | window_match.shift(periods=step, axis=1) # 将匹配位置替换为NaN df.loc[replace_mask] = np.nan
注意事项
- 重叠连续块的处理:如果某行存在长度大于6的连续0段(比如连续10个0),逻辑会自动覆盖段内所有满足连续6个0判定的区域,最终整段连续值都会被替换为NaN,符合预期。
- 避坑提醒:不要直接执行
df[df == 0] = np.nan,这种写法会把所有独立的0全部替换,完全不符合连续6个才触发的要求;也不要用iterrows逐行循环判断,数据量超过1万行时运行效率会非常差。
内容的提问来源于stack exchange,提问作者omer
相关产品推荐
相关产品推荐

