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 апрель

