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


10

我正在使用具有以下结构的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

我的目标是仅查看与他们关联的品牌完全相同的群体X。由于组2具有两个等于brand的观察值X,因此应从结果DataFrame中将其滤除。

输出应如下所示:

   group brand
0      1     A
1      1     B
2      1     X
3      3     E
4      3     F
5      3     X

我知道我应该groupby在“组”列上执行“ a ”,然后过滤那些计数X不等于1的组。过滤的部分就是我要努力的地方。任何帮助,将不胜感激。

Answers:


10

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

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

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

8

这也应该工作

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

6

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

3

解决方案 pd.crosstab

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

我们也可以使用DataFrame.mergeSeries.drop_duplicates

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.