我有两个数据框,如:
df1 = pd.DataFrame({'Id' : [A, B, A, A, C],
'date' : [01-01-15, 31-01-15, 03-02-15, 03-02-15, 15-03-16],
'attr':[1, 5, 3, 5, 6]
}, columns=['Id','date', 'attr'])
df2 = pd.DataFrame({'Id' : [A, B, A, A, B],
'date' : [01-02-15, 01-01-15, 02-02-15, 03-12-15, 15-03-16],
'counter':[1, 1, 2, 3, 2]
}, columns=['Id','date', 'counter'])
第一个包含Id,日期和一些属性。 第二个包含Id,日期和其他属性(计数器随着时间的推移而增加)。 请注意,所有属性都会多次出现。
现在,我想"加入"这两个基于Id,但只考虑过去最接近df2的日期。
实际上,我的预期输出是:
Id | date | att | counter
A | 01-01-15 | 1 | Nan
B | 31-01-15 | 5 | 1
A | 03-02-15 | 3 | 2
A | 03-02-15 | 5 | 2
C | 15-03-16 | 6 | NaN
请注意,NaN可以替换为任何其他合理的值,包括0。
第一个df包含大约300K行,而第二个df包含大约300万行。
答案 0 :(得分:2)
pd.merge_asof(df1, df2.sort_values('date'), on='date', by='Id')
Id date attr counter
0 A 2015-01-01 1 NaN
1 B 2015-01-31 5 1.0
2 A 2015-03-02 3 2.0
3 A 2015-03-02 5 2.0
4 C 2016-03-15 6 NaN
direction
参数的默认值为'backward'
来自Docs
两个DataFrame必须按键排序。
对于左侧DataFrame中的每一行:
- “向后”搜索选择右侧DataFrame中的最后一行,其中“on”键小于或等于左侧的键。
- “转发”搜索选择右侧DataFrame中的第一行,其中“on”键大于或等于左侧的键。
- “最近”搜索选择右侧DataFrame中的行,其中“on”键与左侧键的绝对距离最近。