pandas merge_asof ошибка при использовании float в качестве ключа - PullRequest
0 голосов
/ 25 сентября 2018

При использовании 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 голосов
/ 25 сентября 2018

Похоже, что параметр допуска разрешен только для целочисленных значений и значений 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), а затем вы можете отбросить нулевые строки, как никогда не существовавшие ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...