|
14 | 14 | from pandas.core.dtypes import concat as _concat
|
15 | 15 | from pandas.core.dtypes.common import (
|
16 | 16 | ensure_python_int, is_int64_dtype, is_integer, is_scalar,
|
17 |
| - is_timedelta64_dtype) |
| 17 | + is_timedelta64_dtype, is_list_like, ensure_platform_int) |
18 | 18 | from pandas.core.dtypes.generic import (
|
19 | 19 | ABCDataFrame, ABCSeries, ABCTimedeltaIndex)
|
20 | 20 |
|
@@ -348,6 +348,34 @@ def get_loc(self, key, method=None, tolerance=None):
|
348 | 348 | raise KeyError(key)
|
349 | 349 | return super().get_loc(key, method=method, tolerance=tolerance)
|
350 | 350 |
|
| 351 | + @Appender(_index_shared_docs['get_indexer']) |
| 352 | + def get_indexer(self, target, method=None, limit=None, tolerance=None): |
| 353 | + if method is None and tolerance is None and is_list_like(target): |
| 354 | + if self.step > 0: |
| 355 | + start, stop, step = self.start, self.stop, self.step |
| 356 | + else: |
| 357 | + # Work on reversed range for simplicity: |
| 358 | + start, stop, step = (self.stop - self.step, |
| 359 | + self.start + 1, |
| 360 | + - self.step) |
| 361 | + |
| 362 | + target_array = np.asarray(target) |
| 363 | + if target_array.dtype != int: |
| 364 | + # checks/conversions/roundings are delegated to general method |
| 365 | + return super().get_indexer(target, method=method, |
| 366 | + tolerance=tolerance) |
| 367 | + |
| 368 | + locs = ensure_platform_int(target_array) - start |
| 369 | + valid = (locs % step == 0) & (locs >= 0) & (target_array < stop) |
| 370 | + locs[~valid] = -1 |
| 371 | + locs[valid] = locs[valid] / step |
| 372 | + |
| 373 | + if step != self.step: |
| 374 | + # We reversed this range: transform to original locs |
| 375 | + locs[valid] = len(self) - locs[valid] - 1 |
| 376 | + return np.array(locs, dtype=int) |
| 377 | + return super().get_indexer(target, method=method, tolerance=tolerance) |
| 378 | + |
351 | 379 | def tolist(self):
|
352 | 380 | return list(self._range)
|
353 | 381 |
|
|
0 commit comments