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

如何在Pandas中识别并输出连续缺失值(NaN)的位置区间?

Pandas识别NaN行号并格式化输出区间

问题描述

现有如下Pandas数据:

Num  Name
1    abcd
2    nan
3    nan
4    efdg
5    nan
6    hij
7    nan
8    nan
9    nan
10   nan
11   xyz

需求:识别数据中NaN值的位置,将连续NaN对应的行号合并为(起始,结束)的区间形式,单个NaN则保留行号,最终输出格式如下:

(2,3)  , 5 , (7,10)

目前尝试分组数据,但未得到预期结果。

解决方案

核心思路

  • 筛选出Name列值为NaN对应的Num行号
  • 通过判断行号连续性对数据分组:连续行号归为一组,非连续则开启新组
  • 针对每组长度,生成单个行号或区间格式的字符串
  • 拼接所有格式字符串得到最终输出

代码实现

import pandas as pd
import numpy as np

# 构造示例数据
data = {
    'Num': [1,2,3,4,5,6,7,8,9,10,11],
    'Name': ['abcd', np.nan, np.nan, 'efdg', np.nan, 'hij', np.nan, np.nan, np.nan, np.nan, 'xyz']
}
df = pd.DataFrame(data)

# 提取Name列NaN对应的Num值
nan_num_list = df[df['Name'].isna()]['Num'].tolist()

if not nan_num_list:
    print("无NaN值")
else:
    # 对连续行号分组
    groups = []
    current_group = [nan_num_list[0]]
    for num in nan_num_list[1:]:
        if num == current_group[-1] + 1:
            current_group.append(num)
        else:
            groups.append(current_group)
            current_group = [num]
    groups.append(current_group)  # 加入最后一组

    # 生成格式化片段
    result_fragments = []
    for group in groups:
        if len(group) == 1:
            result_fragments.append(str(group[0]))
        else:
            result_fragments.append(f"({group[0]},{group[-1]})")
    
    # 拼接成最终输出
    final_output = "  , ".join(result_fragments)
    print(final_output)

运行结果

(2,3)  , 5 , (7,10)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:12:57