From 8f3c1ee9d1c9a896cf4cff8a58b5f5fc31b09d3a Mon Sep 17 00:00:00 2001 From: Luke Manley Date: Tue, 12 Sep 2023 17:55:03 -0400 Subject: [PATCH 1/4] BUG: Index.difference not always returning a unique set of values --- pandas/core/indexes/base.py | 4 ++-- pandas/tests/indexes/test_setops.py | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index cd55997ad5f69..d21f404bda23b 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -3598,14 +3598,14 @@ def difference(self, other, sort=None): if len(other) == 0: # Note: we do not (yet) sort even if sort=None GH#24959 - result = self.rename(result_name) + result = self.unique().rename(result_name) if sort is True: return result.sort_values() return result if not self._should_compare(other): # Nothing matches -> difference is everything - result = self.rename(result_name) + result = self.unique().rename(result_name) if sort is True: return result.sort_values() return result diff --git a/pandas/tests/indexes/test_setops.py b/pandas/tests/indexes/test_setops.py index a64994efec85a..9b406c0310000 100644 --- a/pandas/tests/indexes/test_setops.py +++ b/pandas/tests/indexes/test_setops.py @@ -799,8 +799,16 @@ def test_difference_empty_arg(self, index, sort): first = index[5:20] first.name = "name" result = first.difference([], sort) + expected = first.unique() + tm.assert_index_equal(result, expected) - tm.assert_index_equal(result, first) + def test_difference_should_not_compare(self): + # GH ##### + left = Index([1, 1]) + right = Index([True]) + result = left.difference(right) + expected = left.unique() + tm.assert_index_equal(result, expected) @pytest.mark.parametrize("index", ["string"], indirect=True) def test_difference_identity(self, index, sort): From 3a568edddc6c916b2868379e335495526c7b5a91 Mon Sep 17 00:00:00 2001 From: Luke Manley Date: Tue, 12 Sep 2023 18:03:03 -0400 Subject: [PATCH 2/4] whatsnew --- doc/source/whatsnew/v2.2.0.rst | 2 +- pandas/tests/indexes/test_setops.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/whatsnew/v2.2.0.rst b/doc/source/whatsnew/v2.2.0.rst index 249f08c7e387b..fcb09b0f25d79 100644 --- a/doc/source/whatsnew/v2.2.0.rst +++ b/doc/source/whatsnew/v2.2.0.rst @@ -231,7 +231,7 @@ Interval Indexing ^^^^^^^^ -- +- Bug in :meth:`Index.difference` not returning a unique set of values when ``other`` is empty or ``other`` is considered non-comparable (:issue:`55113`) - Missing diff --git a/pandas/tests/indexes/test_setops.py b/pandas/tests/indexes/test_setops.py index 9b406c0310000..7e7638f011622 100644 --- a/pandas/tests/indexes/test_setops.py +++ b/pandas/tests/indexes/test_setops.py @@ -803,7 +803,7 @@ def test_difference_empty_arg(self, index, sort): tm.assert_index_equal(result, expected) def test_difference_should_not_compare(self): - # GH ##### + # GH 55113 left = Index([1, 1]) right = Index([True]) result = left.difference(right) From ab115666b351fc69bccd803b2cc0afac7e793d38 Mon Sep 17 00:00:00 2001 From: Luke Manley Date: Wed, 13 Sep 2023 17:35:47 -0400 Subject: [PATCH 3/4] udpate test --- pandas/tests/indexes/test_setops.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pandas/tests/indexes/test_setops.py b/pandas/tests/indexes/test_setops.py index 7e7638f011622..2424b2702e4c7 100644 --- a/pandas/tests/indexes/test_setops.py +++ b/pandas/tests/indexes/test_setops.py @@ -796,10 +796,12 @@ def test_difference_name_preservation(self, index, second_name, expected, sort): assert result.name == expected def test_difference_empty_arg(self, index, sort): - first = index[5:20] + first = index.copy() + first = first[5:20] first.name = "name" result = first.difference([], sort) - expected = first.unique() + expected = index[5:20].unique() + expected.name = "name" tm.assert_index_equal(result, expected) def test_difference_should_not_compare(self): From 8d6a07fd15aea98191d9723b1275dfc3d8a42d0e Mon Sep 17 00:00:00 2001 From: Luke Manley Date: Wed, 13 Sep 2023 18:06:44 -0400 Subject: [PATCH 4/4] update test --- pandas/tests/indexes/test_setops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/indexes/test_setops.py b/pandas/tests/indexes/test_setops.py index 2424b2702e4c7..d6304774b87c4 100644 --- a/pandas/tests/indexes/test_setops.py +++ b/pandas/tests/indexes/test_setops.py @@ -809,7 +809,7 @@ def test_difference_should_not_compare(self): left = Index([1, 1]) right = Index([True]) result = left.difference(right) - expected = left.unique() + expected = Index([1]) tm.assert_index_equal(result, expected) @pytest.mark.parametrize("index", ["string"], indirect=True)