Python 筛选元素计数不同于1的组上的数据帧

Python 筛选元素计数不同于1的组上的数据帧,python,pandas,dataframe,Python,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

我正在使用具有以下结构的数据帧:

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
我的目标是只查看那些拥有与其关联的品牌
X
的群组。由于第2组有两个观察值等于品牌
X
,因此应将其从结果数据框中过滤掉

输出应如下所示:

   group brand
0      1     A
1      1     B
2      1     X
3      3     E
4      3     F
5      3     X
我知道我应该在组列上执行一个
groupby
,然后过滤那些计数
X
不同于1的组。过滤部分是我挣扎的地方。任何帮助都将不胜感激

用于检查
品牌
是否等于
X
,然后按groupby和
转换
总和
,以及
X
计数等于1的过滤器组:

df[df['brand'].eq('X').groupby(df['group']).transform('sum').eq(1)]


这也应该起作用

df[df.groupby(['group'])['brand'].transform('sum').str.count('X').eq(1)]
输出

 group  brand
0   1   A
1   1   B
2   1   X
7   3   E
8   3   F
9   3   X

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

df.groupby('group').filter(lambda x: x['brand'].str.count('X').sum() == 1)
输出

   group brand
0      1     A
1      1     B
2      1     X
7      3     E
8      3     F
9      3     X
解决

我们也可以使用

   group brand
0      1     A
1      1     B
2      1     X
7      3     E
8      3     F
9      3     X
df[df['group'].map(pd.crosstab(df['group'],df['brand'])['X'].eq(1))]

#   group brand
#0      1     A
#1      1     B
#2      1     X
#7      3     E
#8      3     F
#9      3     X
df.merge(df.loc[df.brand.eq('X'),'group'].drop_duplicates(keep = False),on='group')
#   group brand
#0      1     A
#1      1     B
#2      1     X
#3      3     E
#4      3     F
#5      3     X