Сопоставить два кадра данных по датам между двумя датами - PullRequest
2 голосов
/ 06 апреля 2019

ДАННЫЕ

df1 содержит имя проекта, имя менеджера, а также дату начала и окончания каждого проекта.В дате начала могут отсутствовать значения, но supp_date всегда доступно в качестве приблизительного значения.

project  manager    start_date    end_date      supp_date
Apple    A          2001-05-03    2002-08-09    2002-05-10
Apple    B          2002-10-03    2003-11-12    2002-10-09
Orange   D          nan           2002-10-21    2002-06-25
Banana   C          nan           2003-01-02    2002-11-03
Banana   D          nan           2003-12-15    2003-02-12
Peach    C          2003-07-21    2003-10-12    2003-07-23

У df2 есть только дата и имя проекта:

project    begin_date
Apple      2002-01-02
Banana     2003-05-13

IDEA

Для каждого проекта в df2 я хочу узнать его менеджера.Поскольку один и тот же проект имеет разных менеджеров в разные периоды, я могу использовать дату.Например, проект Apple в df2 стартовал 2002-01-02.В df1 есть два проекта с именем Apple, но 2002-01-02 находится между 2001-05-03 и 2002-08-09.Итак, мы знаем, что менеджер должен быть для Apple в df2.

Проект Banana в df2 стартовал 2003-05-13.Поскольку в df1 нет проектов start_date для банановых проектов, мы используем supp_date в качестве start_date.Итак, 2003-05-13 находится между 2003-02-12 и 2003-12-15, и мы знаем, что менеджер - D.

РЕЗУЛЬТАТ

project    begin_date    manager
Apple      2002-01-02    A
Banana     2003-05-13    D

Есть ли быстрый способ сделать следующее?df2 действительно большой (~ 1 миллион строк), поэтому я думаю, что цикл будет очень медленным ...

1) для каждого проекта в df2, проверьте, какой проект в df1 имеет то же имя

2) на основе 1), если start_date не отсутствует, используйте start_date.В противном случае используйте supp_date

3) найти менеджер, если begin_date находится между start_date и end_date, или между supp_date и end_date, если start_date отсутствует.

Большое спасибо за помощь !!

1 Ответ

1 голос
/ 06 апреля 2019

Я бы рекомендовал использовать merge и between (при условии, что в df2 не будет дублированных проектов с другой датой begin_date):

# merge on project
merge = df.merge(df2, on='project')

# fill missing start_date with supp_date
merge['start_date'] = merge['start_date'].fillna(merge['supp_date'])

# boolean indexing with between
merge[merge['begin_date'].between(merge['start_date'], merge['end_date'])]

  project manager start_date   end_date  supp_date begin_date
0   Apple       A 2001-05-03 2002-08-09 2002-05-10 2002-01-02
3  Banana       D 2003-02-12 2003-12-15 2003-02-12 2003-05-13

Затем вы можете удалить ненужные столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...