使用float作为键时出现pandas merge_asof错误

时间:2018-09-25 17:31:09

标签: python pandas merge

如以下示例所示,使用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

1 个答案:

答案 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)置空,然后您可以删除空行,就像根本不存在的行一样。