Python: обновление значений столбца на основе диапазона дат из другого фрейма данных - PullRequest
0 голосов
/ 01 октября 2018

Есть 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

Нет перекрывающихся событий,В каждом месте есть уникальная запись событий

. До сих пор я думал о том, как: Заполнить столбец в фрейме данных на основе диапазона, найденного в другом фрейме данных , но не могу получитьмоя голова вокруг этогоЛюбая помощь приветствуется.Спасибо!

1 Ответ

0 голосов
/ 01 октября 2018

Решение 1:

Добавить:

df['Event']=events['Event'].tolist()*2

В конец кода.

Тогда сейчас:

print(df)

Is:

        Date          Event        Place
0 2017-01-01    UniHolidays   university
1 2017-01-01  PublicHoliday  residential
2 2017-01-01  PublicHoliday     hospital
3 2017-01-02    UniHolidays   university
4 2017-01-02  PublicHoliday  residential
5 2017-01-02  PublicHoliday     hospital

----------------------------------------

Решение 2:

Если хотите, чтобы их добавили в нужном месте, сделайте:

df=df.drop('Event',1)
df.insert(2,'Event',events['Event'].tolist()*2)

В конце кода.

Тогда сейчас:

print(df)

Выходы:

        Date        Place          Event
0 2017-01-01   university    UniHolidays
1 2017-01-01  residential  PublicHoliday
2 2017-01-01     hospital  PublicHoliday
3 2017-01-02   university    UniHolidays
4 2017-01-02  residential  PublicHoliday
5 2017-01-02     hospital  PublicHoliday

---------------------------------------------------------------

Решение 1 + Решение 2 , будет работать,

Но все же лучше всего это сделать по-отдельности.

Обновление:

Использование:

df=df.drop('Event',1)
df.insert(2,'Event',events['Event'].tolist()*(len(df['Event'])/len(events['Event'].tolist())))

В конце кода.

Тогда сейчас:

print(df)

Выходы:

        Date        Place          Event
0 2017-01-01   university    UniHolidays
1 2017-01-01  residential  PublicHoliday
2 2017-01-01     hospital  PublicHoliday
3 2017-01-02   university    UniHolidays
4 2017-01-02  residential  PublicHoliday
5 2017-01-02     hospital  PublicHoliday
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...