срез строк внутри группы с условием

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

import pandas as pd
import numpy as np
data = {'фрукт': ['груша','огурец','вишня', 'абрикос', 'груша','арбуз','груша','банан', 'груша', 'вишня','яблоко', 'груша', 'вишня', 'абрикос', 'груша', 'банан'],
'страна': ['россия','сша', 'россия','россия', 'франция','ЮАР','франция', 'россия', np.nan,'россия','андорра', 'франция', 'португалия', 'россия', np.nan, 'россия'],
'id': ['01','01','01','01','01','01','01','011', '011', '011','011', '6', '6', '5', '5', '5'],
'месяц': ['март','ПРОПУЩЕНО','январь','сентябрь', 'апрель','ПРОПУЩЕНО','октябрь', 'сентябрь', 'ПРОПУЩЕНО', 'январь','январь', 'январь', 'январь', 'январь', 'ПРОПУЩЕНО', 'апрель']        
}
dates = pd.DataFrame(data, columns = ['фрукт','страна', 'id', 'месяц'])

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

На скриншоте выделенные значения имеют такую логику:в строке с месяцем == ПРОПУЩЕНО заменяются значения страны и месяца значениями из строки выше

Нужно в группе id в строке со значением месяц == ПРОПУЩЕНО заменить значения страна и месяц на значения из строки выше

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

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

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


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

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

ну это совсем просто - ищем строки, в которых, в столбце месяц значения равны "ПРОПУЩЕНО" и заменяем значения в столбцах страна и месяц на NaN. Теперь можно воспользоваться DataFrameGroupBy.ffill(...):

mask = df["месяц"].eq("ПРОПУЩЕНО")

df.loc[mask, ["страна", "месяц"]] = np.nan

res = df.groupby("id").ffill()

результат:

In [73]: res
Out[73]:
      фрукт      страна   id     месяц
0     груша      россия   01      март
1    огурец      россия   01      март
2     вишня      россия   01    январь
3   абрикос      россия   01  сентябрь
4     груша     франция   01    апрель
5     арбуз     франция   01    апрель
6     груша     франция   01   октябрь
7     банан      россия  011  сентябрь
8     груша      россия  011  сентябрь
9     вишня      россия  011    январь
10   яблоко     андорра  011    январь
11    груша     франция    6    январь
12    вишня  португалия    6    январь
13  абрикос      россия    5    январь
14    груша      россия    5    январь
15    банан      россия    5    апрель
→ Ссылка