Skip to content

Commit 54ac621

Browse files
authored
REF: implement Index._get_indexer (#38308)
1 parent 523682f commit 54ac621

File tree

6 files changed

+36
-36
lines changed

6 files changed

+36
-36
lines changed

pandas/core/indexes/base.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -3143,10 +3143,9 @@ def get_loc(self, key, method=None, tolerance=None):
31433143
def get_indexer(
31443144
self, target, method=None, limit=None, tolerance=None
31453145
) -> np.ndarray:
3146+
31463147
method = missing.clean_reindex_fill_method(method)
31473148
target = ensure_index(target)
3148-
if tolerance is not None:
3149-
tolerance = self._convert_tolerance(tolerance, target)
31503149

31513150
# Treat boolean labels passed to a numeric index as not found. Without
31523151
# this fix False and True would be treated as 0 and 1 respectively.
@@ -3160,6 +3159,14 @@ def get_indexer(
31603159
ptarget, method=method, limit=limit, tolerance=tolerance
31613160
)
31623161

3162+
return self._get_indexer(target, method, limit, tolerance)
3163+
3164+
def _get_indexer(
3165+
self, target: "Index", method=None, limit=None, tolerance=None
3166+
) -> np.ndarray:
3167+
if tolerance is not None:
3168+
tolerance = self._convert_tolerance(tolerance, target)
3169+
31633170
if not is_dtype_equal(self.dtype, target.dtype):
31643171
this = self.astype(object)
31653172
target = target.astype(object)

pandas/core/indexes/category.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import pandas.core.indexes.base as ibase
2525
from pandas.core.indexes.base import Index, _index_shared_docs, maybe_extract_name
2626
from pandas.core.indexes.extension import NDArrayBackedExtensionIndex, inherit_names
27-
import pandas.core.missing as missing
2827

2928
_index_doc_kwargs = dict(ibase._index_doc_kwargs)
3029
_index_doc_kwargs.update({"target_klass": "CategoricalIndex"})
@@ -496,9 +495,9 @@ def _maybe_cast_indexer(self, key) -> int:
496495
return self._data._unbox_scalar(key)
497496

498497
@Appender(_index_shared_docs["get_indexer"] % _index_doc_kwargs)
499-
def get_indexer(self, target, method=None, limit=None, tolerance=None):
500-
method = missing.clean_reindex_fill_method(method)
501-
target = ibase.ensure_index(target)
498+
def _get_indexer(
499+
self, target: "Index", method=None, limit=None, tolerance=None
500+
) -> np.ndarray:
502501

503502
self._check_indexing_method(method)
504503

pandas/core/indexes/interval.py

+17-19
Original file line numberDiff line numberDiff line change
@@ -663,9 +663,9 @@ def get_loc(
663663
)
664664
)
665665
@Appender(_index_shared_docs["get_indexer"])
666-
def get_indexer(
666+
def _get_indexer(
667667
self,
668-
target: AnyArrayLike,
668+
target: Index,
669669
method: Optional[str] = None,
670670
limit: Optional[int] = None,
671671
tolerance: Optional[Any] = None,
@@ -679,35 +679,33 @@ def get_indexer(
679679
"use IntervalIndex.get_indexer_non_unique"
680680
)
681681

682-
target_as_index = ensure_index(target)
683-
684-
if isinstance(target_as_index, IntervalIndex):
682+
if isinstance(target, IntervalIndex):
685683
# equal indexes -> 1:1 positional match
686-
if self.equals(target_as_index):
684+
if self.equals(target):
687685
return np.arange(len(self), dtype="intp")
688686

689-
if self._is_non_comparable_own_type(target_as_index):
687+
if self._is_non_comparable_own_type(target):
690688
# different closed or incompatible subtype -> no matches
691-
return np.repeat(np.intp(-1), len(target_as_index))
689+
return np.repeat(np.intp(-1), len(target))
692690

693-
# non-overlapping -> at most one match per interval in target_as_index
691+
# non-overlapping -> at most one match per interval in target
694692
# want exact matches -> need both left/right to match, so defer to
695693
# left/right get_indexer, compare elementwise, equality -> match
696-
left_indexer = self.left.get_indexer(target_as_index.left)
697-
right_indexer = self.right.get_indexer(target_as_index.right)
694+
left_indexer = self.left.get_indexer(target.left)
695+
right_indexer = self.right.get_indexer(target.right)
698696
indexer = np.where(left_indexer == right_indexer, left_indexer, -1)
699-
elif is_categorical_dtype(target_as_index.dtype):
700-
target_as_index = cast("CategoricalIndex", target_as_index)
697+
elif is_categorical_dtype(target.dtype):
698+
target = cast("CategoricalIndex", target)
701699
# get an indexer for unique categories then propagate to codes via take_1d
702-
categories_indexer = self.get_indexer(target_as_index.categories)
703-
indexer = take_1d(categories_indexer, target_as_index.codes, fill_value=-1)
704-
elif not is_object_dtype(target_as_index):
700+
categories_indexer = self.get_indexer(target.categories)
701+
indexer = take_1d(categories_indexer, target.codes, fill_value=-1)
702+
elif not is_object_dtype(target):
705703
# homogeneous scalar index: use IntervalTree
706-
target_as_index = self._maybe_convert_i8(target_as_index)
707-
indexer = self._engine.get_indexer(target_as_index.values)
704+
target = self._maybe_convert_i8(target)
705+
indexer = self._engine.get_indexer(target.values)
708706
else:
709707
# heterogeneous scalar index: defer elementwise to get_loc
710-
return self._get_indexer_pointwise(target_as_index)[0]
708+
return self._get_indexer_pointwise(target)[0]
711709

712710
return ensure_platform_int(indexer)
713711

pandas/core/indexes/multi.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
)
5656
from pandas.core.indexes.frozen import FrozenList
5757
from pandas.core.indexes.numeric import Int64Index
58-
import pandas.core.missing as missing
5958
from pandas.core.ops.invalid import make_invalid_op
6059
from pandas.core.sorting import (
6160
get_group_index,
@@ -2597,9 +2596,7 @@ def _get_partial_string_timestamp_match_key(self, key):
25972596
return key
25982597

25992598
@Appender(_index_shared_docs["get_indexer"] % _index_doc_kwargs)
2600-
def get_indexer(self, target, method=None, limit=None, tolerance=None):
2601-
method = missing.clean_reindex_fill_method(method)
2602-
target = ensure_index(target)
2599+
def _get_indexer(self, target: Index, method=None, limit=None, tolerance=None):
26032600

26042601
# empty indexer
26052602
if is_list_like(target) and not len(target):

pandas/core/indexes/period.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -449,14 +449,13 @@ def join(self, other, how="left", level=None, return_indexers=False, sort=False)
449449
# Indexing Methods
450450

451451
@Appender(_index_shared_docs["get_indexer"] % _index_doc_kwargs)
452-
def get_indexer(self, target, method=None, limit=None, tolerance=None):
453-
target = ensure_index(target)
452+
def _get_indexer(self, target: Index, method=None, limit=None, tolerance=None):
454453

455454
if not self._should_compare(target):
456455
return self._get_indexer_non_comparable(target, method, unique=True)
457456

458457
if isinstance(target, PeriodIndex):
459-
target = target._get_engine_target() # i.e. target.asi8
458+
target = target._int64index # i.e. target.asi8
460459
self_index = self._int64index
461460
else:
462461
self_index = self
@@ -467,7 +466,7 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None):
467466
# convert tolerance to i8
468467
tolerance = self._maybe_convert_timedelta(tolerance)
469468

470-
return Index.get_indexer(self_index, target, method, limit, tolerance)
469+
return Index._get_indexer(self_index, target, method, limit, tolerance)
471470

472471
def get_loc(self, key, method=None, tolerance=None):
473472
"""

pandas/core/indexes/range.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -355,9 +355,9 @@ def get_loc(self, key, method=None, tolerance=None):
355355
return super().get_loc(key, method=method, tolerance=tolerance)
356356

357357
@Appender(_index_shared_docs["get_indexer"])
358-
def get_indexer(self, target, method=None, limit=None, tolerance=None):
358+
def _get_indexer(self, target, method=None, limit=None, tolerance=None):
359359
if com.any_not_none(method, tolerance, limit) or not is_list_like(target):
360-
return super().get_indexer(
360+
return super()._get_indexer(
361361
target, method=method, tolerance=tolerance, limit=limit
362362
)
363363

@@ -371,7 +371,7 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None):
371371
target_array = np.asarray(target)
372372
if not (is_signed_integer_dtype(target_array) and target_array.ndim == 1):
373373
# checks/conversions/roundings are delegated to general method
374-
return super().get_indexer(target, method=method, tolerance=tolerance)
374+
return super()._get_indexer(target, method=method, tolerance=tolerance)
375375

376376
locs = target_array - start
377377
valid = (locs % step == 0) & (locs >= 0) & (target_array < stop)

0 commit comments

Comments
 (0)