From 79d6a50f00b780c13175ef9ecfd017a3442b0918 Mon Sep 17 00:00:00 2001 From: phofl Date: Sun, 29 Nov 2020 18:27:17 +0100 Subject: [PATCH 1/5] Improve is_unqiue check --- pandas/core/indexes/base.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 3f89b0619e600..01edb9e9ad3e0 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2858,13 +2858,15 @@ def _intersection(self, other, sort=False): indexer = algos.unique1d(Index(rvals).get_indexer_non_unique(lvals)[0]) indexer = indexer[indexer != -1] - result = other.take(indexer).unique()._values + result = Index(other.take(indexer)) + if not result.is_unique: + result = result.unique()._values if sort is None: result = algos.safe_sort(result) # Intersection has to be unique - assert algos.unique(result).shape == result.shape + assert Index(other.take(indexer)).is_unique return result From 53e69f7ceaeeff69cf3702f08d533196a5bb2a71 Mon Sep 17 00:00:00 2001 From: phofl Date: Sun, 29 Nov 2020 20:12:44 +0100 Subject: [PATCH 2/5] Improve assert --- pandas/core/indexes/base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 01edb9e9ad3e0..e27b14ccdc78f 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2861,12 +2861,14 @@ def _intersection(self, other, sort=False): result = Index(other.take(indexer)) if not result.is_unique: result = result.unique()._values + else: + result = result._values if sort is None: result = algos.safe_sort(result) # Intersection has to be unique - assert Index(other.take(indexer)).is_unique + assert Index(result).is_unique return result From 6ec04c1e776642f3c0e3a573788c61964ae9ef46 Mon Sep 17 00:00:00 2001 From: phofl Date: Sun, 29 Nov 2020 20:12:57 +0100 Subject: [PATCH 3/5] Remove index --- pandas/core/indexes/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index e27b14ccdc78f..21c090a9a0273 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2858,7 +2858,7 @@ def _intersection(self, other, sort=False): indexer = algos.unique1d(Index(rvals).get_indexer_non_unique(lvals)[0]) indexer = indexer[indexer != -1] - result = Index(other.take(indexer)) + result = other.take(indexer) if not result.is_unique: result = result.unique()._values else: From cd1accad31d7ff2f13705c919f574c4caaa0288f Mon Sep 17 00:00:00 2001 From: phofl Date: Sun, 29 Nov 2020 21:38:42 +0100 Subject: [PATCH 4/5] Add unique check to Index.unique --- pandas/core/indexes/base.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 21c090a9a0273..792cf34e57329 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2379,6 +2379,10 @@ def unique(self, level=None): """ if level is not None: self._validate_index_level(level) + + if self.is_unique: + return self + result = super().unique() return self._shallow_copy(result) @@ -2858,11 +2862,7 @@ def _intersection(self, other, sort=False): indexer = algos.unique1d(Index(rvals).get_indexer_non_unique(lvals)[0]) indexer = indexer[indexer != -1] - result = other.take(indexer) - if not result.is_unique: - result = result.unique()._values - else: - result = result._values + result = other.take(indexer).unique()._values if sort is None: result = algos.safe_sort(result) From aba0f2a342d5557dc06c0507145b6abf7733423a Mon Sep 17 00:00:00 2001 From: phofl Date: Sun, 29 Nov 2020 22:06:42 +0100 Subject: [PATCH 5/5] Add shallow copy --- pandas/core/indexes/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 792cf34e57329..d1d71e584ae3d 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2381,7 +2381,7 @@ def unique(self, level=None): self._validate_index_level(level) if self.is_unique: - return self + return self._shallow_copy() result = super().unique() return self._shallow_copy(result)