Есть 2 кадра данных df
и events
, которые выглядят следующим образом:
import pandas as pd
df = pd.DataFrame({'Place':['university','residential','hospital','university','residential','hospital'],
'Date':['2017-01-01','2017-01-01','2017-01-01','2017-01-02','2017-01-02','2017-01-02'],
'Event':['None','None','None','None','None','None']
})
events = pd.DataFrame({'Place':['university','residential','hospital'], 'Start_Date':['2017-01-01','2017-01-01','2017-01-01'],
'End_Date':['2017-02-26','2017-01-02','2017-01-02'],
'Event':['UniHolidays','PublicHoliday','PublicHoliday']})
#Convert to datetime
events.Start_Date = pd.to_datetime(events.Start_Date.astype(str), format='%Y-%m-%d')
events.End_Date = pd.to_datetime(events.End_Date.astype(str), format='%Y-%m-%d')
df.Date = pd.to_datetime(df.Date.astype(str), format='%Y-%m-%d')
df имеет 1 запись на каждую дату в 2017 году для каждого места
df:
Date Place Event
2017-01-01 university None
2017-01-01 residential None
2017-01-01 hospital None
2017-01-02 university None
2017-01-02 residential None
2017-01-02 hospital None
второй фрейм данных содержит события для этих мест, но с диапазоном дат
events:
Place Start_Date End_Date Event
a 2017-01-01 2017-02-26 UniHoliday
b 2017-01-01 2017-01-02 PublicHoliday
c 2017-01-01 2017-01-02 PublicHoliday
Задача состоит в том, чтобы обновить df
, используя events
, чтобы
, если df.Place
= events.Place
, иdf.Date
находится в диапазоне (events.Start_Date, events.End_Date
), затем df.Event
следует обновить, указав соответствующий event.Event
Ожидаемый результат:
Date Place Event
2017-01-01 university UniHoliday
2017-01-01 residential PublicHoliday
2017-01-01 hospital PublicHoliday
2017-01-02 university UniHoliday
2017-01-02 residential PublicHoliday
2017-01-02 hospital PublicHoliday
Нет перекрывающихся событий,В каждом месте есть уникальная запись событий
. До сих пор я думал о том, как: Заполнить столбец в фрейме данных на основе диапазона, найденного в другом фрейме данных , но не могу получитьмоя голова вокруг этогоЛюбая помощь приветствуется.Спасибо!