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. Поэтому сортировка уже не поможет
Как можно это сделать?
Ожидаемый результат (также на первом скриншоте выделил, что должны получить в результате):
Ответы (2 шт):
Я посмотрел, ответ будет тот же самый, что и в предыдущем вашем вопросе, если данные уже отсортированы нужным образом по месяцам:
dates.loc[(dates.фрукт == 'груша').shift(fill_value=False)]
Вывод:
фрукт страна вид_фр месяц
1 груша сша 2 январь
2 арбуз NaN 3 январь
5 груша NaN 7 февраль
6 вишня канада 5 февраль
8 вишня португалия 10 март
11 груша NaN 7 апрель
12 банан перу 7 апрель
А если нужной сортировки нет, то нужно завести колонку с цифровыми номерами месяцев (иначе нормально не отсортируется) и предварительно сделать dates = dates.sort_values("номер_месяца").
А группы тут никак не нужны, достаточно сортировки.


