熊猫在多列上的merge_asof

时间:2018-11-05 15:24:24

标签: python pandas

我有两个数据框:

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

输出:

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

我在DF2.EmpStartDate和DF1.StartDate上使用merge_asof,然后对Location和StartDate进行分组以实现此目的。 但是我得到的结果不正确,因为我只合并了日期列。我需要合并“位置”和“日期”列上的数据框。看起来merge_asof不支持在多列上合并。如何合并不同位置的日期列?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

使用它:

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