过滤器组包含特定值

Filter group contains specific values

我想过滤具有特定值的组。取下面的样本数据:

df = pd.DataFrame({'comp': ['a','b','a','b','c','d', 'c', 'c', 'd'], 'grid': [1,2,2,4,1,2,1,2,2]})

df:

  comp  grid  val
0    a     1   10
1    b     2   11
2    a     2   12
3    b     4   13
4    c     1   14
5    d     2   15
6    c     1   16
7    c     2   17
8    d     2   18

我想分组 comp 并检查在每个组中 grid 是否至少有一个值 1 和一个值 2。预期结果是组 a 和组 c

  comp  grid  val
0    a     1   10
2    a     2   12
4    c     1   14
6    c     1   16
7    c     2   17

我尝试 groupbytransform 但没有成功

您可以使用 GroupBy.transform 与比较 sets:

#if contains 1,2 and some another values
df = df[df.groupby('comp')['grid'].transform(lambda x: set(x) >= set([1,2]))]
print (df)
  comp  grid
0    a     1
2    a     2
4    c     1
6    c     1
7    c     2

#if contains only 1,2 
df = df[df.groupby('comp')['grid'].transform(lambda x: set(x) == set([1,2]))]
print (df)
  comp  grid
0    a     1
2    a     2
4    c     1
6    c     1
7    c     2

如果需要至少一个 1 和一个 2 是可能的使用:

intersect = np.intersect1d(df.loc[df['grid'].eq(1),'comp'], df.loc[df['grid'].eq(2),'comp'])
print (intersect)
['a' 'c']

df = df[df['comp'].isin(intersect)]
print (df)
  comp  grid
0    a     1
2    a     2
4    c     1
6    c     1
7    c     2