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

如何筛选DataFrame中包含完整1-6索引序列的分组行

筛选完成全流程的ID对应的DataFrame行

问题描述

现有按ID分组的DataFrame,每个ID对应一个流程,流程完成的标志是包含index为1、2、3、4、5、6的所有活动。需要筛选出所有完成流程的ID对应的行。

原DataFrame结构:

ID          A  index           
1   activity1      1 
1   activity2      2    
1   activity3      3    
1   activity4      4    
1   activity5      5    
1   activity6      6    
2   activity7      1    
2   activity8      2    
2   activity9      3    
3   activity10     1    
3   activity11     2    
3   activity12     3  
3   activity13     4    
3   activity14     5    
3   activity15     6    

期望结果:

ID          A   index           
1   activity1      1 
1   activity2      2    
1   activity3      3    
1   activity4      4    
1   activity5      5    
1   activity6      6    
3   activity10     1    
3   activity11     2    
3   activity12     3  
3   activity13     4    
3   activity14     5    
3   activity15     6    

原尝试的代码存在逻辑漏洞:

df['a'] = df['index'].groupby(df['index']).sum()
df2 = df[df['a'].gt(20)] 
  • 错误地按index分组而非ID;
  • 用sum≥21判断不可靠:若ID的index包含重复值或非目标值(如0、11),可能出现sum达标但流程未完成的误判。

可靠的筛选方法

方法1:检查是否包含所有目标index值

通过分组检查每个ID的index集合是否包含1-6的全部数值,避免重复或缺失的误判:

import pandas as pd

# 定义完整流程的index集合
full_indices = {1, 2, 3, 4, 5, 6}

# 用transform生成筛选掩码,直接过滤原DataFrame
mask = df.groupby('ID')['index'].transform(lambda x: full_indices.issubset(set(x)))
result_df = df[mask]

方法2:结合极值与唯一性判断

适用于每个index在流程中仅出现一次的场景,通过检查最小index为1、最大为6,且唯一值数量为6,确保无缺失、无重复:

mask = df.groupby('ID')['index'].transform(
    lambda x: x.min() == 1 and x.max() == 6 and x.nunique() == 6
)
result_df = df[mask]

方法3:严格匹配index序列

如果要求流程必须严格按1-6的顺序执行且无额外行,可直接对比分组后的index序列:

valid_ids = df.groupby('ID')['index'].apply(lambda x: x.equals(pd.Series([1,2,3,4,5,6])))
result_df = df[df['ID'].isin(valid_ids[valid_ids].index)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:21:42