Используйте GroupBy.transform
с пользовательской лямбда-функцией для сравнения значений, преобразованных в tuple
, list
, а затем фильтруйте в boolean indexing
:
Также при необходимости не уверен, всегда ли порядок a,b
первая сортировка:
df = df.sort_values(['item','colour','machine'])
f = lambda x: tuple(x) == tuple(['a','b'])
#alternative
f = lambda x: list(x) == list(['a','b'])
#solution if want compare and remove duplicates
#f = lambda x: set(x) == set(['a','b'])
df = df[df.groupby(['item','colour'])['machine'].transform(f)]
print (df)
item colour machine
0 car red a
1 car red b
6 bike blue a
7 bike blue b