如何检查DataFrame列是否无缺失递增及识别连续值区间
咱们一个个来解决这两个Pandas相关的问题,思路和代码都给你理清楚:
问题1:检查DataFrame某列是否为无缺失的递增序列
要验证这个,核心要满足两个条件:没有缺失值 + 序列严格/非递减递增,咱们一步步来:
第一步:先排查缺失值
用df['你的列名'].isna().any()就能快速判断,如果返回True,说明列里有缺失值,直接不符合要求。第二步:验证递增性
这里分两种场景,你按需选择:- 严格递增(后一个值必须比前一个大,不能相等):
先计算列中相邻元素的差值,去掉第一个无意义的NaN,再检查所有差值是否都大于0:diffs = df['你的列名'].diff().dropna() is_strictly_increasing = (diffs > 0).all() - 非递减递增(允许后一个值等于前一个):
把上面的判断改成(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的地方就是两个连续区间的分界处。
- 按分割点分组:把原始序列切成多个连续的子组。
- 过滤单元素组:只保留元素个数≥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
相关产品推荐
相关产品推荐

