在Pandas中筛选满足所有元素均属于指定列表且无额外元素的分组子集
搞定分组筛选:只保留所有元素都在指定列表里的分组
嘿,我来帮你修正这个问题!你要实现的是保留那些**分组里所有Values元素都属于The_list**的分组,之前的代码写法有几个小问题,咱们一步步来解决:
第一步:先找出符合条件的分组
首先我们可以先给每个Groups做个检查,看看这个组里的所有Values是不是都在The_list里:
import pandas as pd # 先还原你的数据 The_list = ["A","B","D"] data = { "Groups": ["G1","G1","G1","G1","G2","G2","G2","G2","G3","G3","G4","G4","G4","G4","G5","G5","G5"], "Values": ["A","B","C","D","A","B","A","D","A","D","Z","D","E","C","A","B","D"] } df = pd.DataFrame(data) # 筛选出所有元素都在The_list里的分组 valid_groups = df.groupby("Groups")["Values"].apply(lambda group: group.isin(The_list).all()) # 把符合条件的分组名提取成列表 valid_groups = valid_groups[valid_groups].index.tolist()
第二步:筛选出目标数据
拿到合法的分组列表后,直接在原DataFrame里筛选就行:
result = df[df["Groups"].isin(valid_groups)] print(result)
运行后就能得到你想要的结果:
Groups Values 4 G2 A 5 G2 B 6 G2 A 7 G2 D 14 G5 A 15 G5 B 16 G5 D
顺便说下你之前代码的问题
你写的df.loc[df.Values.str.contains["A" & "B" & "D"].groupby(df.Groups)]有几个问题:
str.contains是用来检查单个字符串是否包含指定内容的,不能用&把多个字符串连起来,而且它是针对单个元素,不是分组层面的检查- 语法错误:
str.contains是方法,得用括号()调用,不是方括号[] - 逻辑偏差:你需要的是整个分组所有元素都在列表里,而不是单个元素包含A/B/D
另外,还有个更简洁的写法,不用单独生成分组列表,直接用transform在原DataFrame上标记:
result = df[df.groupby("Groups")["Values"].transform(lambda group: group.isin(The_list).all())]
这个写法会给每一行标记对应的分组是否符合条件,直接筛选标记为True的行就行,结果和上面完全一致。
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

