нацеливание значений в одном столбце с последующим использованием соответствующих отметок даты для поиска в других столбцах - PullRequest
1 голос
/ 22 января 2020

У меня есть задача, которую нужно решить, когда я пытаюсь выучить Pandas, и ранее уже публиковал вопрос здесь , но теперь мне нужно адаптировать его для поиска значений на основе date , вместо обратного отсчета на основе номеров строк, с которыми мне любезно помог @jazrael.

По сути, у меня есть такой фрейм данных: -

id    food     date        mood
id 1  nuts     2018-11-12  high
id 2  potatoes 2018-11-13  low
id 4  bread    2018-11-13  high
id 5  fish     2018-11-14  high
id 6  nuts     2018-11-14  high
id 7  fish     2018-11-15  allergies
id 8  beer     2018-11-16  low
id 9  bread    2018-11-17  high
id 10 fish     2018-11-18  high
id 11 pasta    2018-11-19  allergies

Я буду sh искать по столбцу «настроение» для «аллергий», затем с помощью значения «дата» в строке, в которой мы нашли значение «аллергии», для обратного отсчета на 2 дня и регистрации всех соответствующих значений продуктов питания в столбце продуктов питания (хотя также в c пищевые продукты в ряду были обнаружены аллергии).

Таким образом, итоговый кадр данных может выглядеть следующим образом ( Я оставлю столбцы «дата» и «настроение» для облегчения понимания вопроса ): -

id    food     date        mood
id 2  potatoes 2018-11-13  low
id 3  fish     2018-11-13  high
id 4  bread    2018-11-13  high
id 5  fish     2018-11-14  high
id 6  nuts     2018-11-14  high
id 7  fish     2018-11-15  allergies
id 9  bread    2018-11-17  high
id 10 fish     2018-11-18  high
id 11 pasta    2018-11-19  allergies

Любая помощь высоко ценится!

micdoher

1 Ответ

1 голос
/ 22 января 2020

Решение аналогично предыдущему ответу , используйте только GroupBy.transform с GroupBy.last для даты allergies, вычитайте 2 дней и фильтр по Series.ge in boolean indexing:

s = df['mood'].eq('allergies').iloc[::-1].cumsum()
df = df[df['date'].ge(df['date'].groupby(s).transform('last') - pd.Timedelta(2, unit='d'))]
print (df)
      id      food       date       mood
1   id 2  potatoes 2018-11-13        low
2   id 4     bread 2018-11-13       high
3   id 5      fish 2018-11-14       high
4   id 6      nuts 2018-11-14       high
5   id 7      fish 2018-11-15  allergies
7   id 9     bread 2018-11-17       high
8  id 10      fish 2018-11-18       high
9  id 11     pasta 2018-11-19  allergies

Деталь :

print (df['date'].groupby(s).transform('last'))
0   2018-11-15
1   2018-11-15
2   2018-11-15
3   2018-11-15
4   2018-11-15
5   2018-11-15
6   2018-11-19
7   2018-11-19
8   2018-11-19
9   2018-11-19
Name: date, dtype: datetime64[ns]
...