Панды merge_asof на нескольких столбцах - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть два кадра данных:

DF1:

StartDate      Location

2013-01-01     20000002
2013-03-01     20000002
2013-08-01     20000002
2013-01-01     20000003
2013-03-01     20000003
2013-05-01     20000003
2013-01-01     20000043

DF2:

EmpStartDate   Location

2012-12-17     20000002.0 
2013-02-25     20000002.0 
2013-06-26     20000002.0 
2012-09-24     20000003.0 
2013-01-07     20000003.0 
2013-07-01     20000043.0

Я хочу подсчет из DF2, где DF1.Location = DF2.Location и DF2.EmpStartDate <= DF1.StartDate </p>

Выход:

StartDate      Location   Count

2013-01-01     20000002   1
2013-03-01     20000002   2
2013-08-01     20000002   3
2013-01-01     20000003   1
2013-03-01     20000003   2
2013-05-01     20000003   2
2013-01-01     20000043   0

Я использую merge_asof для DF2.EmpStartDate и DF1.StartDate, а затем выполняю группирование по Location и StartDate для достижения этой цели. Но я получаю неверные результаты, так как объединяю только столбцы с датами. Мне нужно объединить кадры данных в столбцах «Местоположение» и «Дата». Похоже, что merge_asof не поддерживает объединение нескольких столбцов. Как объединить столбцы даты в разных группах местоположений?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Позвольте использовать это:

df1.merge(df2, on='Location')\
   .query('EmpStartDate <= StartDate')\
   .groupby(['StartDate','Location'])['EmpStartDate']\
   .count()\
   .reindex(df1, fill_value=0)\
   .rename('Count')\
   .reset_index()

Выход:

   StartDate  Location  Count
0 2013-01-01  20000002      1
1 2013-03-01  20000002      2
2 2013-08-01  20000002      3
3 2013-01-01  20000003      1
4 2013-03-01  20000003      2
5 2013-05-01  20000003      2
6 2013-01-01  20000043      0
0 голосов
/ 05 ноября 2018

merge_asof способен производить только слияние 1: 1, так что я не думаю, что это то, что вы хотите здесь.

Простой, но, возможно, неэффективный способ вычислить это - выполнить один большой merge для Location, а затем подсчитать, сколько строк имеют df.EmpStartDate < df.StartDate

df = df1.merge(df2)
(df.assign(Count = df.EmpStartDate < df.StartDate)
   .groupby(['StartDate', 'Location'])
   .Count.sum()
   .astype('int')
   .reset_index())

Выход:

   StartDate  Location  Count
0 2013-01-01  20000002      1
1 2013-01-01  20000003      1
2 2013-01-01  20000043      0
3 2013-03-01  20000002      2
4 2013-03-01  20000003      2
5 2013-05-01  20000003      2
6 2013-08-01  20000002      3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...