我有两个带有事件的有序数据帧,但是可能缺少一些事件:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'val': [ 1.9, 2, 10, 7, 4], 'cat': range(5)})
df2 = pd.DataFrame({'val': [5, 2.1, 2, 7, 4, 1.9], 'var': range(6)})
在上面的示例中,预期的对((None,0), (0,1), (1,2), (2,None), (3,3), (4,4), (None,5)
)由缩进指示。
现在,我想通过val
外部连接两个数据帧,如上面的示例所示,保留现有顺序(因此第一个df中的1.9应该与相同位置的对应2.1配对,而不是在第二个df末尾的完全匹配)。
merge_asof
要求按键(val
)对两个df进行排序,merge_ordered
仅接受完全匹配。
首先,我创建了一个可能的匹配项列表:
tol = .3
closeness = np.abs(df1.val[:,np.newaxis] - df2.val[np.newaxis,:])
idx = np.vstack(np.where(closeness < tol))
# array([[0, 0, 0, 1, 1, 1, 3, 4],
# [1, 2, 5, 1, 2, 5, 3, 4]])
成对的3->3
和4->4
很明显,但是剩余的可能性使我怀疑它比我想象的还要复杂。