срез строк внутри группы с условием
Имеется фрейм данных:
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 апрель

