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

如何提取pandas DataFrame指定列中连续NaN达阈值的首尾行索引

提取pandas指定列中超长连续NaN块的首尾行索引

实现思路是通过布尔掩码识别NaN行,给连续同值的行分配分组ID,再筛选长度符合阈值的块提取索引,完整实现步骤和代码如下:

  • 生成指定列的NaN布尔掩码,True表示对应行是NaN值
  • 对布尔掩码做移位异或累加操作,给每一段连续的NaN/非NaN分配唯一的分组ID
  • 过滤出仅属于NaN的分组,统计每个分组的长度后筛选出长度超过阈值的分组
  • 遍历符合条件的分组提取首尾行索引

完整可运行代码

import pandas as pd
import numpy as np

# 构造80行6列的测试DataFrame
df = pd.DataFrame(np.random.randn(80, 6), columns=[f'col{i}' for i in range(6)])
# 手动构造测试NaN段:长度12、8、16,其中超过阈值10的有两段
df.loc[5:16, 'col2'] = np.nan
df.loc[30:37, 'col2'] = np.nan
df.loc[50:65, 'col2'] = np.nan

# 配置参数:指定列、连续NaN长度阈值
target_col = 'col2'
threshold = 10

# 核心计算逻辑
col_na_mask = df[target_col].isna()
# 生成连续块的唯一ID
block_ids = (col_na_mask != col_na_mask.shift()).cumsum()
# 仅保留NaN对应的块
na_block_groups = block_ids[col_na_mask]
# 筛选长度超过阈值的块
valid_blocks = na_block_groups.groupby(na_block_groups).filter(lambda x: len(x) > threshold)
# 收集每个符合条件块的首尾索引
nan_block_index_range = []
for block_id in valid_blocks.unique():
    current_block_index = valid_blocks[valid_blocks == block_id].index
    nan_block_index_range.append((current_block_index[0], current_block_index[-1]))

print(nan_block_index_range)

上述代码运行输出为:

[(5, 16), (50, 65)]

如果需要批量处理多列,只需要在外层套列遍历循环复用上述逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:45:06