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

如何利用np.where识别长度超过指定阈值的连续非NaN值并返回对应布尔结果

没问题,我来帮你搞定这个需求!要找出连续3个及以上非NaN值的位置并标记为True,咱们可以用纯NumPy的方法一步步来,思路是先识别连续非NaN的块,再统计每个块的长度,最后判断长度是否达标。

步骤详解 + 代码实现

首先咱们先构造你给出的示例数据:

import numpy as np

# 对应你表格里的value列
values = np.array([np.nan, np.nan, 1, 1, np.nan, 4, 2, 3, np.nan, np.nan, 1, 3, 3, 5])
  1. 标记非NaN位置
    先把所有非NaN的位置设为True,NaN设为False:
not_nan = ~np.isnan(values)
  1. 给连续非NaN块分配唯一ID
    通过计算差值的方式,识别每个连续非NaN块的起始位置,然后生成每个元素所属的块ID(NaN的块ID设为-1,方便后续过滤):
# 计算块ID:当从NaN切换到非NaN时,ID加1
block_ids = np.cumsum(np.concatenate([[0], np.diff(not_nan.astype(int)) == 1]))
# 把NaN位置的ID设为无效值-1
block_ids[~not_nan] = -1
  1. 统计每个块的长度
    用np.bincount统计每个有效块的长度,再把长度映射回对应的元素位置:
# 统计每个有效块的长度
block_lengths = np.bincount(block_ids[block_ids != -1])
# 创建和values同长度的数组,存储每个元素所在块的长度
lengths = np.zeros_like(values, dtype=int)
for idx, length in enumerate(block_lengths):
    lengths[block_ids == idx] = length
  1. 生成最终结果
    用np.where判断每个位置的块长度是否≥3,满足则返回True,否则False:
result = np.where(lengths >= 3, True, False)

运行后输出的result就是你要的结果:

[False False False False False  True  True  True False False  True  True  True  True]

备选:用Pandas快速实现

如果你刚好在使用Pandas,也可以用更简洁的代码完成:

import pandas as pd

df = pd.DataFrame({'value': values})
# 用groupby和transform获取每个连续非NaN块的长度
df['consecutive_nan'] = df['value'].notna().groupby((df['value'].isna()).cumsum()).transform('sum') >= 3

这样直接就能得到你表格里的consecutive_nan列啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 03:14:05