pandas использование shift совместно с условием для каждой группы

Имеется фрейм данных:

data = {'фрукт': ['абрикос', 'груша', 'абрикос', 'груша','вишня', 'банан'],
'страна': ['россия', 'франция', 'бельгия', 'албания','португалия', 'франция'],
'id': ['02','02','5', '5','5', '5'],
'месяц': ['март', 'сентябрь', 'январь', 'ПРОПУЩЕНО','январь', 'апрель']        
}
 df= pd.DataFrame(data, columns = ['фрукт','страна', 'id', 'месяц'])

введите сюда описание изображения

Нужно отобрать строку перед строкой , где страна = франция, но предыдущей строкой считаем строки где страна не албания и не португалия.

df[(df.страна=='франция').shift(-1).fillna(False)] не понимаю как сюда можно добавить условие с игнорированием указанных стран и применить для каждой группы id. Как можно это сделать?

Ожидаемый результат:

введите сюда описание изображения


Ответы (1 шт):

Автор решения: CrazyElf

Я могу только через промежуточный датафрейм решение предложить - предварительно выкидываем строки, которые нам не подойдут, а потом уже делаем shift:

df1 = df[~df.страна.isin(['албания','португалия'])]
df1[(df1.страна=='франция').shift(-1).fillna(False)]

С группировкой вроде бы тоже кажется работает:

df1 = df[~df.страна.isin(['албания','португалия'])]
df1.groupby('id').apply(lambda x: x[(x.страна=='франция').shift(-1).fillna(False)]).reset_index(drop=True)
→ Ссылка