在元素计数不同于 1 的组上过滤 DataFrame

glp*_*psx 10 python dataframe pandas

我正在使用具有以下结构的 DataFrame:

import pandas as pd

df = pd.DataFrame({'group':[1,1,1,2,2,2,2,3,3,3],
                   'brand':['A','B','X','C','D','X','X','E','F','X']})

print(df)

   group brand
0      1     A
1      1     B
2      1     X
3      2     C
4      2     D
5      2     X
6      2     X
7      3     E
8      3     F
9      3     X
Run Code Online (Sandbox Code Playgroud)

我的目标是仅查看与一个品牌X相关联的组。由于第 2 组有两个观察值等于品牌X,因此应该从结果数据帧中过滤掉它。

输出应如下所示:

   group brand
0      1     A
1      1     B
2      1     X
3      3     E
4      3     F
5      3     X
Run Code Online (Sandbox Code Playgroud)

我知道我应该groupby在组列上做一个,然后过滤那些计数X不同于 1 的组。过滤部分是我努力的地方。任何帮助,将不胜感激。

ank*_*_91 10

使用series.eq检查,如果brand等于X,则GROUPBY和transform sum和过滤团中,X数等于1:

df[df['brand'].eq('X').groupby(df['group']).transform('sum').eq(1)]
Run Code Online (Sandbox Code Playgroud)
   group brand
0      1     A
1      1     B
2      1     X
7      3     E
8      3     F
9      3     X
Run Code Online (Sandbox Code Playgroud)


moy*_*oys 8

这也应该有效

df[df.groupby(['group'])['brand'].transform('sum').str.count('X').eq(1)]
Run Code Online (Sandbox Code Playgroud)

输出

 group  brand
0   1   A
1   1   B
2   1   X
7   3   E
8   3   F
9   3   X
Run Code Online (Sandbox Code Playgroud)


Vis*_*dev 6

Groupby 列并应用'X'组中字符计数等于 1的简单过滤器

df.groupby('group').filter(lambda x: x['brand'].str.count('X').sum() == 1)
Run Code Online (Sandbox Code Playgroud)

输出

   group brand
0      1     A
1      1     B
2      1     X
7      3     E
8      3     F
9      3     X
Run Code Online (Sandbox Code Playgroud)