Python 加入日期限制
我有两个数据帧,如下所示:Python 加入日期限制,python,pandas,join,Python,Pandas,Join,我有两个数据帧,如下所示: 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-0
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包含大约30万行,而第二个df包含大约300万行。您需要
方向
参数的默认值是向后
来自文档
两个数据帧必须按键排序
对于左侧数据框中的每一行:
- “向后”搜索选择右数据帧中“开”键小于或等于左键的最后一行
- “向前”搜索选择右数据帧中的第一行,其“开”键大于或等于左键
- “最近”搜索选择右数据帧中的行,其“开”键在绝对距离上最接近左键
我认为这是不可能的,因为你需要一个精确的值来连接。我所能想到的最好的方法是将日期截断为月份,然后根据分组中计数器的天数编写一些自定义函数来加入。谢谢。由于某种原因,我得到以下错误。TypeError:“非类型”对象不可调用。我正在试着调试它,但运气不太好。Id或Date都不为NULL或NaN。当您在玩具数据上运行时,我提供的内容是否有效?如果是这样,那就是你的数据。如果它对玩具数据不起作用,那么它就是版本控制。我正在运行Python 3.6和pandas 0.22。如果它对玩具数据有效,那么你应该提供足够的数据,这样错误就会发生,但要保持最小。它有效。我没有使用datetime64[ns]。谢谢!
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