Skip to content

Commit fa48f5f

Browse files
authored
REF: implement _get_engine_target (#32611)
1 parent 27ad779 commit fa48f5f

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

pandas/core/indexes/base.py

+16-9
Original file line numberDiff line numberDiff line change
@@ -571,10 +571,10 @@ def _cleanup(self):
571571
def _engine(self):
572572
# property, for now, slow to look up
573573

574-
# to avoid a reference cycle, bind `_ndarray_values` to a local variable, so
574+
# to avoid a reference cycle, bind `target_values` to a local variable, so
575575
# `self` is not passed into the lambda.
576-
_ndarray_values = self._ndarray_values
577-
return self._engine_type(lambda: _ndarray_values, len(self))
576+
target_values = self._get_engine_target()
577+
return self._engine_type(lambda: target_values, len(self))
578578

579579
# --------------------------------------------------------------------
580580
# Array-Like Methods
@@ -2976,7 +2976,7 @@ def get_indexer(
29762976
"backfill or nearest reindexing"
29772977
)
29782978

2979-
indexer = self._engine.get_indexer(target._ndarray_values)
2979+
indexer = self._engine.get_indexer(target._get_engine_target())
29802980

29812981
return ensure_platform_int(indexer)
29822982

@@ -2990,19 +2990,20 @@ def _convert_tolerance(self, tolerance, target):
29902990
def _get_fill_indexer(
29912991
self, target: "Index", method: str_t, limit=None, tolerance=None
29922992
) -> np.ndarray:
2993+
2994+
target_values = target._get_engine_target()
2995+
29932996
if self.is_monotonic_increasing and target.is_monotonic_increasing:
29942997
engine_method = (
29952998
self._engine.get_pad_indexer
29962999
if method == "pad"
29973000
else self._engine.get_backfill_indexer
29983001
)
2999-
indexer = engine_method(target._ndarray_values, limit)
3002+
indexer = engine_method(target_values, limit)
30003003
else:
30013004
indexer = self._get_fill_indexer_searchsorted(target, method, limit)
30023005
if tolerance is not None:
3003-
indexer = self._filter_indexer_tolerance(
3004-
target._ndarray_values, indexer, tolerance
3005-
)
3006+
indexer = self._filter_indexer_tolerance(target_values, indexer, tolerance)
30063007
return indexer
30073008

30083009
def _get_fill_indexer_searchsorted(
@@ -3915,6 +3916,12 @@ def _internal_get_values(self) -> np.ndarray:
39153916
"""
39163917
return self.values
39173918

3919+
def _get_engine_target(self) -> np.ndarray:
3920+
"""
3921+
Get the ndarray that we can pass to the IndexEngine constructor.
3922+
"""
3923+
return self._values
3924+
39183925
@Appender(IndexOpsMixin.memory_usage.__doc__)
39193926
def memory_usage(self, deep: bool = False) -> int:
39203927
result = super().memory_usage(deep=deep)
@@ -4657,7 +4664,7 @@ def get_indexer_non_unique(self, target):
46574664
elif self.is_all_dates and target.is_all_dates: # GH 30399
46584665
tgt_values = target.asi8
46594666
else:
4660-
tgt_values = target._ndarray_values
4667+
tgt_values = target._get_engine_target()
46614668

46624669
indexer, missing = self._engine.get_indexer_non_unique(tgt_values)
46634670
return ensure_platform_int(indexer), missing

pandas/core/indexes/extension.py

+3
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@ def __array__(self, dtype=None) -> np.ndarray:
231231
def _ndarray_values(self) -> np.ndarray:
232232
return self._data._ndarray_values
233233

234+
def _get_engine_target(self) -> np.ndarray:
235+
return self._data._values_for_argsort()
236+
234237
@Appender(Index.dropna.__doc__)
235238
def dropna(self, how="any"):
236239
if how not in ("any", "all"):

0 commit comments

Comments
 (0)