From a674083ac51076f7cd823ffd7c404be9df29e717 Mon Sep 17 00:00:00 2001 From: Manraj Singh Grover Date: Thu, 2 Nov 2017 21:59:11 +0530 Subject: [PATCH 1/5] Fix 18068: Updates merge_asof error, now outputs datatypes --- pandas/core/reshape/merge.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pandas/core/reshape/merge.py b/pandas/core/reshape/merge.py index e409090e76944..29e75863869e0 100644 --- a/pandas/core/reshape/merge.py +++ b/pandas/core/reshape/merge.py @@ -1255,8 +1255,9 @@ def _get_merge_keys(self): # validate index types are the same for lk, rk in zip(left_join_keys, right_join_keys): if not is_dtype_equal(lk.dtype, rk.dtype): - raise MergeError("incompatible merge keys, " - "must be the same type") + raise MergeError("incompatible merge keys {lkdtype} and " + "{rkdtype}, must be the same type" + .format(lkdtype=lk.dtype, rkdtype=rk.dtype)) # validate tolerance; must be a Timedelta if we have a DTI if self.tolerance is not None: From 340baf9c182aff8db0bd3d0d57edf40a34fa9eb2 Mon Sep 17 00:00:00 2001 From: Manraj Singh Grover Date: Fri, 3 Nov 2017 13:39:13 +0530 Subject: [PATCH 2/5] Bug 18068: Enumerates on keys for checking dtypes --- pandas/core/reshape/merge.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pandas/core/reshape/merge.py b/pandas/core/reshape/merge.py index 29e75863869e0..e8dfd763baed2 100644 --- a/pandas/core/reshape/merge.py +++ b/pandas/core/reshape/merge.py @@ -1253,11 +1253,12 @@ def _get_merge_keys(self): join_names) = super(_AsOfMerge, self)._get_merge_keys() # validate index types are the same - for lk, rk in zip(left_join_keys, right_join_keys): + for i, (lk, rk) in enumerate(zip(left_join_keys, right_join_keys)): if not is_dtype_equal(lk.dtype, rk.dtype): - raise MergeError("incompatible merge keys {lkdtype} and " - "{rkdtype}, must be the same type" - .format(lkdtype=lk.dtype, rkdtype=rk.dtype)) + raise MergeError("incompatible merge keys [{i} {lkdtype} and " + "{rkdtype}], must be the same type" + .format(i=i, lkdtype=lk.dtype, + rkdtype=rk.dtype)) # validate tolerance; must be a Timedelta if we have a DTI if self.tolerance is not None: From a81d9dc2c6de9d73593b462afea4a0227c91f123 Mon Sep 17 00:00:00 2001 From: Manraj Singh Grover Date: Fri, 3 Nov 2017 15:38:35 +0530 Subject: [PATCH 3/5] Release notes for 0.21.1 updated with fix 18068 --- doc/source/whatsnew/v0.21.1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v0.21.1.txt b/doc/source/whatsnew/v0.21.1.txt index 4adafe7c06450..b7b8240a8d77e 100644 --- a/doc/source/whatsnew/v0.21.1.txt +++ b/doc/source/whatsnew/v0.21.1.txt @@ -102,7 +102,7 @@ Sparse Reshaping ^^^^^^^^^ -- +- Error message in ``pd.merge_asof()`` for key datatype mismatch now includes datatype of left and right key (:issue:`18068`) - - From 919ddc3cc9555f1b728d4b5b13d52d13aae89422 Mon Sep 17 00:00:00 2001 From: Manraj Singh Grover Date: Fri, 3 Nov 2017 16:22:47 +0530 Subject: [PATCH 4/5] Fixed index brackets #18068 --- pandas/core/reshape/merge.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/reshape/merge.py b/pandas/core/reshape/merge.py index e8dfd763baed2..0234a5563326c 100644 --- a/pandas/core/reshape/merge.py +++ b/pandas/core/reshape/merge.py @@ -1255,8 +1255,8 @@ def _get_merge_keys(self): # validate index types are the same for i, (lk, rk) in enumerate(zip(left_join_keys, right_join_keys)): if not is_dtype_equal(lk.dtype, rk.dtype): - raise MergeError("incompatible merge keys [{i} {lkdtype} and " - "{rkdtype}], must be the same type" + raise MergeError("incompatible merge keys [{i}] {lkdtype} and " + "{rkdtype}, must be the same type" .format(i=i, lkdtype=lk.dtype, rkdtype=rk.dtype)) From c532b3bf333d2dd95161c19cda3dc0f667d110e2 Mon Sep 17 00:00:00 2001 From: Manraj Singh Grover Date: Sat, 4 Nov 2017 00:37:59 +0530 Subject: [PATCH 5/5] Tests merge_asof merge datatype mismatch error message --- pandas/tests/reshape/test_merge_asof.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pandas/tests/reshape/test_merge_asof.py b/pandas/tests/reshape/test_merge_asof.py index 78bfa2ff8597c..4b2680b9be592 100644 --- a/pandas/tests/reshape/test_merge_asof.py +++ b/pandas/tests/reshape/test_merge_asof.py @@ -973,3 +973,15 @@ def test_on_float_by_int(self): columns=['symbol', 'exch', 'price', 'mpv']) assert_frame_equal(result, expected) + + def test_merge_datatype_error(self): + """ Tests merge datatype mismatch error """ + msg = 'merge keys \[0\] object and int64, must be the same type' + + left = pd.DataFrame({'left_val': [1, 5, 10], + 'a': ['a', 'b', 'c']}) + right = pd.DataFrame({'right_val': [1, 2, 3, 6, 7], + 'a': [1, 2, 3, 6, 7]}) + + with tm.assert_raises_regex(MergeError, msg): + merge_asof(left, right, on='a')