如何筛选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
相关产品推荐
相关产品推荐

