我有两个数据框:
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不支持在多列上合并。如何合并不同位置的日期列?
答案 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