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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:02:34