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

如何验证pandas分组内指定列逐行严格+1递增并定位异常位置

解决方案

直接使用 pandas 原生的分组差分能力就可以实现需求,代码简洁且定位准确:

核心实现逻辑

每个分组内的time_idx严格逐行+1递增时,相邻行的差值恒等于1,我们只要按series分组后计算差分,筛选出差值不等于1的行即可定位异常。

代码示例

基础版(数据已按series和time_idx排序的场景)

# 计算每个分组内time_idx的逐行差值
data['time_diff'] = data.groupby('series')['time_idx'].diff()

# 筛选异常行(排除每个分组第一行的NaN差值,仅保留差值不等于1的行)
abnormal_rows = data[data['time_diff'].notna() & (data['time_diff'] != 1)]

# 输出结果
if abnormal_rows.empty:
    print("所有series的time_idx均满足严格逐行+1递增规则")
else:
    print("异常位置如下:")
    print(abnormal_rows[['series', 'time_idx', 'value']])

增强版(数据可能乱序的场景)

如果不能保证原数据已经按series和time_idx排序,可以先排序再校验:

# 先排序保证时序顺序
data_sorted = data.sort_values(['series', 'time_idx']).reset_index(drop=True)
data_sorted['time_diff'] = data_sorted.groupby('series')['time_idx'].diff()
abnormal_rows = data_sorted[data_sorted['time_diff'].notna() & (data_sorted['time_diff'] != 1)]

补充校验起始值

差分仅能校验中间行的连续性,如果还需要验证每个series的起始time_idx为0,可以补充以下逻辑:

start_abnormal = data_sorted.groupby('series').head(1).query('time_idx != 0')
if not start_abnormal.empty:
    print("起始值异常的series如下:")
    print(start_abnormal[['series', 'time_idx']])

方案优势

  • 完全依赖pandas原生API,没有自定义的模运算逻辑,代码易读且不易出错
  • 自动适配不同长度的series分组,不需要提前预设每个分组的行数,扩展性更强
  • 直接返回异常行的全量数据,不需要额外做索引映射即可定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:06:03