You need to enable JavaScript to run this app. Pandas:如何查找数据框任意行中相邻列连续6个0并替换为NaN?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 04:45:08