假设我有下面的数据框,涵盖数百个不同的名字:

df = pd.DataFrame({"NAME":["A", "A", "A" ,"A", 
                       "B", "B", "B", 
                       "C", "C", "C", "C",
                       "D", "D",],
               "CLASS":["LI","BO","EQ","AI",
                           "LI", "EQ", "AI", 
                           "LI","BO","EQ","AI",
                           "EQ", "AI", 
                          ]})

使用Pandas的groupby函数,我应该如何过滤掉那些同时包含EQ和AI但不包含BO的名字?理想情况下,我应该获得以下内容:

NAME CLASS
B    LI
B    EQ
B    AI
D    EQ
D    AI

非常感谢您的任何建议!

推荐答案

使用groupby.transform与设置操作:

out = df[df.groupby('NAME')['CLASS']
           .transform(lambda x: ((S:=set(x))>={'EQ', 'AI'}) and ('BO' not in S))]
# or
# out = df[df.groupby('NAME')['CLASS']
#            .transform(lambda x: ((S:=set(x))>={'EQ', 'AI'})
#                       and not S.intersection({'BO'}))]

groupby.aggisin的变体:

g = df.groupby('NAME')['CLASS'].agg(set)
out = df[df['NAME'].isin(g.index[(g >= {'EQ', 'AI'}) & ~(g >= {'BO'})])]

输出:

   NAME CLASS
4     B    LI
5     B    EQ
6     B    AI
11    D    EQ
12    D    AI
Intermediates

为了完整性,

# transform approach
   NAME CLASS  g >= {'EQ', 'AI'}  ~(g >= {'BO'})      &
0     A    LI               True           False  False
1     A    BO               True           False  False
2     A    EQ               True           False  False
3     A    AI               True           False  False
4     B    LI               True            True   True
5     B    EQ               True            True   True
6     B    AI               True            True   True
7     C    LI               True           False  False
8     C    BO               True           False  False
9     C    EQ               True           False  False
10    C    AI               True           False  False
11    D    EQ               True            True   True
12    D    AI               True            True   True
13    E    AI              False            True  False

# agg approach
                     g  (g >= {'EQ', 'AI'})  ~(g >= {'BO'})      &
NAME                                                              
A     {LI, EQ, BO, AI}                 True           False  False
B         {LI, EQ, AI}                 True            True   True
C     {LI, EQ, BO, AI}                 True           False  False
D             {EQ, AI}                 True            True   True
E                 {AI}                False            True  False

Python相关问答推荐

仅从风格中获取 colored颜色 循环

使用numpy提取数据块

带条件计算最小值

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

如何在Python数据框架中加速序列的符号化

运输问题分支定界法&

在极性中创建条件累积和

导入...从...混乱

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

如何根据一列的值有条件地 Select 前N组?

不能使用Gekko方程'

Python—转换日期:价目表到新行

合并与拼接并举

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

在电影中向西北方向对齐""

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

无法使用请求模块从网页上抓取一些产品的名称

如何批量训练样本大小为奇数的神经网络?

Python:使用asyncio.StreamReader.readline()读取长行