pandas группировка и срез строк

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

data = {'фрукт': ['груша','груша','арбуз','банан','груша', 'груша', 'вишня', 'груша', 'вишня', 'абрикос', 'груша', 'груша', 'банан'],
'страна': ['россия','сша', np.nan, 'россия', np.nan, np.nan,'канада', 'франция', 'португалия', 'испания', np.nan, np.nan, 'перу'],
'id': ['01','01','01','011', '011', '011', '011', '6', '6', '5', '5', '5', '5'],
'месяц': ['январь','январь','январь','январь', 'январь', 'январь', 'январь', 'март', 'март', 'апрель', 'апрель', 'апрель', 'апрель']        
}
dates = pd.DataFrame(data, columns = ['фрукт','страна', 'id', 'месяц'])

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

Нужно отфильтровать срезы строк с грушей так, чтобы в группе id за каждый месяц срез начинался c последней строки, содержащей грушу, и заканчивался строкой, следующей после последней строки с грушей. Обязательное условие - группировка по id.

Как можно это сделать?

Ожидаемый результат (также на первом скриншоте выделил, что должны получить в результате):

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


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

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

Мне не совсем ясно, почему в итог не вошла груша номер 7. Потому что, можно было бы сделать так:

res = pd.DataFrame()
for i, g in dates.groupby("id"):
    idx = g.loc[dates["фрукт"]=="груша"].index[-1]
    res = pd.concat([res, dates[idx:idx+2]]).sort_index()

тогда res будет:

   фрукт      страна   id   месяц
1   груша         сша   01  январь
2   арбуз         NaN   01  январь
5   груша         NaN  011  январь
6   вишня      канада  011  январь
7   груша     франция    6    март
8   вишня  португалия    6    март
11  груша         NaN    5  апрель
12  банан        перу    5  апрель
→ Ссылка