如以下示例所示,使用pandas merge_asof
import pandas as pd
left = pd.DataFrame({'a': [1.1, 5.5, 10.9], 'left_val': ['a', 'b', 'c']})
right = pd.DataFrame({'a': [1.0, 2.8, 5.4, 5.55, 7.4], 'right_val': [1, 2, 3, 6, 7]})
pd.merge_asof(left, right, on='a', direction='nearest', tolerance=5)
我得到了错误
~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\reshape\merge.py in _get_merge_keys(self)
1363
1364 else:
-> 1365 raise MergeError("key must be integer or timestamp")
1366
1367 # validate allow_exact_matches
MergeError: key must be integer or timestamp
看起来很奇怪,因为在我阅读的文档中
on : label
Field name to join on. Must be found in both DataFrames. The data MUST be ordered. Furthermore this must be a numeric column, such as datetimelike, integer, or float. On or left_on/right_on must be given
所以使用浮点数作为键应该没问题...
我正在使用熊猫0.23.0
答案 0 :(得分:1)
看起来公差参数仅适用于整数和timedelta值,因此出现错误后,它可以很好地运行。
也许您可以通过后处理步骤修正它:
right["b"] = right["a"]
df_result = pd.merge_asof(left, right, on='a', direction='nearest')
df_result.loc[abs(df_result["b"]-df_result["a"]) > 5, :] = np.nan
df_result.dropna()
这将通过最接近的位置合并它们,然后将连接超出容忍度的所有行(在这种情况下为5)置空,然后您可以删除空行,就像根本不存在的行一样。