Используйте groupby
с 2 сериями для сравниваемого столбца color
с eq
с any
как минимум для одного True
на группа:
df = grpd_df[grpd_df['colour'].eq('red').groupby(level=0).transform('any')]
print (df)
colour item material
item
hat 0 red hat felt
1 blue hat plastic
scarf 0 purple scarf wool
1 red scarf wool
Деталь
print (grpd_df['colour'].eq('red').groupby(level=0).transform('any'))
item
belt 0 False
1 False
hat 0 True
1 True
scarf 0 True
1 True
Name: colour, dtype: bool
Более медленная альтернатива с filter
:
df = grpd_df.groupby(level=0).filter(lambda x: x['colour'].eq('red').any())
Если хотите работать с оригиналом DataFrame
:
df = df[df['colour'].eq('red').groupby(df['item']).transform('any')]
print (df)
colour item material
0 red hat felt
1 purple scarf wool
4 blue hat plastic
5 red scarf wool
EDIT:
Если хотите работать с MultiIndex
:
data = {'colour': ['red','purple','green','purple','blue','red'], 'item': ['hat','scarf','belt','belt','hat','scarf'], 'material': ['felt','wool','leather','wool','plastic','wool']}
df = pd.DataFrame(data=data).set_index(['colour','item'])
print (df)
material
colour item
red hat felt
purple scarf wool
green belt leather
purple belt wool
blue hat plastic
red scarf wool
df = df[pd.Series(df.index.get_level_values('colour') == 'red', index=df.index).groupby(level=1).transform('any')]
Второе filter
решение:
df = df.groupby(level=1).filter(lambda x: (x.index.get_level_values('colour') == 'red').any())
print (df)
material
colour item
red hat felt
purple scarf wool
blue hat plastic
red scarf wool