получить группы, которые содержат все необходимые значения - PullRequest
0 голосов
/ 15 мая 2018
df = pd.DataFrame({'A' : ['bar', 'bar', 'bar', 'foo',
                          'foo', 'foo'],
                    'B' : [1, 2, 3, 4, 5, 6],
                  'C' : [2.0, 5., 8., 1., 2., 9.]})
>>> df
     A  B    C
0  bar  1  2.0
1  bar  2  5.0
2  bar  3  8.0
3  foo  4  1.0
4  foo  5  2.0
5  foo  6  9.0

Как я могу получить группы с neededVals = [1.0,2.0] в C, если I groupby('A'):

3  foo  4  1.0
4  foo  5  2.0
5  foo  6  9.0 

И только эти значения:

3  foo  4  1.0
4  foo  5  2.0

1 Ответ

0 голосов
/ 15 мая 2018

Я думаю, нужно сравнить set с GroupBy.transform и отфильтровать по boolean indexing:

neededVals = [1.0,2.0] 
df = df[df.groupby('A')['C'].transform(lambda x: set(x) >= set(neededVals))]
print (df)
     A  B    C
3  foo  4  1.0
4  foo  5  2.0
5  foo  6  9.0

Деталь :

print (df.groupby('A')['C'].transform(lambda x: set(x) >= set(neededVals)))
0    False
1    False
2    False
3     True
4     True
5     True
Name: C, dtype: bool

А для второго сначала отфильтруйте ненужные строки по isin, а затем сравните равенство:

df = df[df['C'].isin(neededVals)]
df = df[df.groupby('A')['C'].transform(lambda x: set(x) == set(neededVals))]
print (df)
     A  B    C
3  foo  4  1.0
4  foo  5  2.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...