diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 310ee4c3a63e3..7f141531e0d71 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -13,6 +13,7 @@ Sequence, TypeVar, cast, + overload, ) import warnings @@ -159,6 +160,8 @@ ) if TYPE_CHECKING: + from typing import Literal + from pandas import ( CategoricalIndex, DataFrame, @@ -5193,7 +5196,8 @@ def set_value(self, arr, key, value): """ @Appender(_index_shared_docs["get_indexer_non_unique"] % _index_doc_kwargs) - def get_indexer_non_unique(self, target): + def get_indexer_non_unique(self, target) -> tuple[np.ndarray, np.ndarray]: + # both returned ndarrays are np.intp target = ensure_index(target) if not self._should_compare(target) and not is_interval_dtype(self.dtype): @@ -5217,7 +5221,7 @@ def get_indexer_non_unique(self, target): tgt_values = target._get_engine_target() indexer, missing = self._engine.get_indexer_non_unique(tgt_values) - return ensure_platform_int(indexer), missing + return ensure_platform_int(indexer), ensure_platform_int(missing) @final def get_indexer_for(self, target, **kwargs) -> np.ndarray: @@ -5237,8 +5241,31 @@ def get_indexer_for(self, target, **kwargs) -> np.ndarray: indexer, _ = self.get_indexer_non_unique(target) return indexer + @overload + def _get_indexer_non_comparable( + self, target: Index, method, unique: Literal[True] = ... + ) -> np.ndarray: + # returned ndarray is np.intp + ... + + @overload + def _get_indexer_non_comparable( + self, target: Index, method, unique: Literal[False] + ) -> tuple[np.ndarray, np.ndarray]: + # both returned ndarrays are np.intp + ... + + @overload + def _get_indexer_non_comparable( + self, target: Index, method, unique: bool = True + ) -> np.ndarray | tuple[np.ndarray, np.ndarray]: + # any returned ndarrays are np.intp + ... + @final - def _get_indexer_non_comparable(self, target: Index, method, unique: bool = True): + def _get_indexer_non_comparable( + self, target: Index, method, unique: bool = True + ) -> np.ndarray | tuple[np.ndarray, np.ndarray]: """ Called from get_indexer or get_indexer_non_unique when the target is of a non-comparable dtype. diff --git a/pandas/core/indexes/category.py b/pandas/core/indexes/category.py index 5b98b956e33e6..b20926ee85a3d 100644 --- a/pandas/core/indexes/category.py +++ b/pandas/core/indexes/category.py @@ -508,6 +508,7 @@ def _get_indexer( limit: int | None = None, tolerance=None, ) -> np.ndarray: + # returned ndarray is np.intp if self.equals(target): return np.arange(len(self), dtype="intp") @@ -515,11 +516,15 @@ def _get_indexer( return self._get_indexer_non_unique(target._values)[0] @Appender(_index_shared_docs["get_indexer_non_unique"] % _index_doc_kwargs) - def get_indexer_non_unique(self, target): + def get_indexer_non_unique(self, target) -> tuple[np.ndarray, np.ndarray]: + # both returned ndarrays are np.intp target = ibase.ensure_index(target) return self._get_indexer_non_unique(target._values) - def _get_indexer_non_unique(self, values: ArrayLike): + def _get_indexer_non_unique( + self, values: ArrayLike + ) -> tuple[np.ndarray, np.ndarray]: + # both returned ndarrays are np.intp """ get_indexer_non_unique but after unrapping the target Index object. """ @@ -538,7 +543,7 @@ def _get_indexer_non_unique(self, values: ArrayLike): codes = self.categories.get_indexer(values) indexer, missing = self._engine.get_indexer_non_unique(codes) - return ensure_platform_int(indexer), missing + return ensure_platform_int(indexer), ensure_platform_int(missing) @doc(Index._convert_list_indexer) def _convert_list_indexer(self, keyarr): diff --git a/pandas/core/indexes/interval.py b/pandas/core/indexes/interval.py index 171ab57264f85..d7b5f66bd385f 100644 --- a/pandas/core/indexes/interval.py +++ b/pandas/core/indexes/interval.py @@ -721,6 +721,7 @@ def _get_indexer( limit: int | None = None, tolerance: Any | None = None, ) -> np.ndarray: + # returned ndarray is np.intp if isinstance(target, IntervalIndex): # equal indexes -> 1:1 positional match @@ -753,6 +754,7 @@ def _get_indexer( @Appender(_index_shared_docs["get_indexer_non_unique"] % _index_doc_kwargs) def get_indexer_non_unique(self, target: Index) -> tuple[np.ndarray, np.ndarray]: + # both returned ndarrays are np.intp target = ensure_index(target) if isinstance(target, IntervalIndex) and not self._should_compare(target): @@ -772,6 +774,7 @@ def get_indexer_non_unique(self, target: Index) -> tuple[np.ndarray, np.ndarray] return ensure_platform_int(indexer), ensure_platform_int(missing) def _get_indexer_pointwise(self, target: Index) -> tuple[np.ndarray, np.ndarray]: + # both returned ndarrays are np.intp """ pointwise implementation for get_indexer and get_indexer_non_unique. """