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

如何移除无测试#0的个体数据及序列中断后的行?

数据处理需求与实现

问题背景

现有不同个体的测试编号数据(编号范围0-3),原始数据如下:

ID            Nb_Test
A1            0
A1            1
A1            2
A2            1
A2            2
A2            3
A3            0
A3            1
A3            3

需要完成两个处理步骤:

  • 移除所有未包含测试编号0的个体(比如A2无0,直接剔除全部数据)
  • 对保留的个体,移除其测试序列中断后的所有数据(比如A3的序列0→1→3,1到3出现中断,需剔除3及之后的数据)

最终期望结果:

ID            Nb_Test
A1            0
A1            1
A1            2
A3            0
A3            1

解决方案

方法一:SQL实现

通过CTE分步处理,先筛选有效个体,再检测序列中断点,最后保留有效数据:

WITH valid_ids AS (
    -- 筛选出包含测试0的个体ID
    SELECT DISTINCT ID
    FROM test_data
    WHERE Nb_Test = 0
),
gap_detection AS (
    -- 计算每个个体测试编号的相邻差值,判断是否中断
    SELECT 
        t.ID,
        t.Nb_Test,
        t.Nb_Test - LAG(t.Nb_Test) OVER (PARTITION BY t.ID ORDER BY t.Nb_Test) AS gap
    FROM test_data t
    JOIN valid_ids v ON t.ID = v.ID
),
max_valid_test AS (
    -- 确定每个个体的最大有效测试编号(中断前的最后一个编号)
    SELECT 
        ID,
        COALESCE(
            MIN(CASE WHEN gap != 1 THEN Nb_Test END) - 1,
            MAX(Nb_Test)
        ) AS max_test
    FROM gap_detection
    GROUP BY ID
)
-- 筛选出每个个体不超过最大有效编号的数据
SELECT t.ID, t.Nb_Test
FROM test_data t
JOIN max_valid_test m ON t.ID = m.ID
WHERE t.Nb_Test <= m.max_test
ORDER BY t.ID, t.Nb_Test;

方法二:Python Pandas实现

利用分组和差值计算来过滤数据:

import pandas as pd

# 构造原始数据
df = pd.DataFrame({
    'ID': ['A1', 'A1', 'A1', 'A2', 'A2', 'A2', 'A3', 'A3', 'A3'],
    'Nb_Test': [0, 1, 2, 1, 2, 3, 0, 1, 3]
})

# 第一步:保留包含测试0的个体
valid_ids = df[df['Nb_Test'] == 0]['ID'].unique()
df = df[df['ID'].isin(valid_ids)]

# 第二步:过滤每个个体的中断后数据
def keep_continuous(group):
    group_sorted = group.sort_values('Nb_Test')
    # 计算相邻测试编号的差值
    gaps = group_sorted['Nb_Test'].diff().dropna()
    # 找到第一个中断的位置
    first_break = gaps[gaps > 1].index.min()
    if pd.notna(first_break):
        return group_sorted.loc[:first_break - 1]
    return group_sorted

# 分组处理并整理结果
result = df.groupby('ID').apply(keep_continuous).reset_index(drop=True)
print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:00:51