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

如何检查DataFrame列是否无缺失递增及识别连续值区间

咱们一个个来解决这两个Pandas相关的问题,思路和代码都给你理清楚:

问题1:检查DataFrame某列是否为无缺失的递增序列

要验证这个,核心要满足两个条件:没有缺失值 + 序列严格/非递减递增,咱们一步步来:

  • 第一步:先排查缺失值
    用df['你的列名'].isna().any()就能快速判断,如果返回True,说明列里有缺失值,直接不符合要求。

  • 第二步:验证递增性
    这里分两种场景,你按需选择:

    1. 严格递增(后一个值必须比前一个大,不能相等):
      先计算列中相邻元素的差值,去掉第一个无意义的NaN,再检查所有差值是否都大于0:
      diffs = df['你的列名'].diff().dropna()
      is_strictly_increasing = (diffs > 0).all()
      
    2. 非递减递增(允许后一个值等于前一个):
      把上面的判断改成(diffs >= 0).all()就可以。

    另外还有个更直观的方法:把原列和排序后的列对比,如果完全相等且无缺失,说明是递增的(适合非递减场景):

    has_no_missing = not df['你的列名'].isna().any()
    is_increasing_order = df['你的列名'].equals(df['你的列名'].sort_values())
    # 如果是严格递增,还要额外检查有没有重复值
    has_no_duplicates = not df['你的列名'].duplicated().any()
    final_result = has_no_missing and is_increasing_order and has_no_duplicates  # 严格递增的情况
    
问题2:识别排序后列中的连续值区间(排除单独非连续值)

已知你的Number列已经排好序了,咱们用NumPy+Pandas组合拳来实现,思路很清晰:

  1. 找连续区间的分割点:计算相邻元素的差值,差值大于1的地方就是两个连续区间的分界处。
  2. 按分割点分组:把原始序列切成多个连续的子组。
  3. 过滤单元素组:只保留元素个数≥2的组,然后取每个组的首尾值作为区间。

直接上代码,对应你给的示例数据:

import pandas as pd
import numpy as np

# 模拟你的数据
df = pd.DataFrame({'Number': [1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,18,20,21,22]})

# 计算相邻差值,找到分割点
diff_values = np.diff(df['Number'])
# 找到差值>1的位置,加1是因为diff的索引比原数据少一位
split_positions = np.where(diff_values > 1)[0] + 1

# 把序列分割成连续子组
continuous_groups = np.split(df['Number'].values, split_positions)

# 过滤掉只有单个元素的组,生成区间列表
result_intervals = [[group[0], group[-1]] for group in continuous_groups if len(group) > 1]

print(result_intervals)
# 输出正好是你要的:[[1, 10], [12, 16], [20, 22]]

解释下关键步骤:

  • np.where(diff_values > 1)[0]会得到差值大于1的索引,比如你的数据里是[9,14,15],加1后变成[10,15,16],这就是分割的位置。
  • np.split会把数组按这些位置切开,比如第三个子组是[18],因为长度为1会被过滤掉,剩下的就是符合要求的连续区间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:48:09