|
73 | 73 | from pandas.core.arrays import Categorical
|
74 | 74 | from pandas.core.arrays.categorical import factorize_from_iterables
|
75 | 75 | import pandas.core.common as com
|
76 |
| -from pandas.core.indexers import is_empty_indexer |
77 | 76 | import pandas.core.indexes.base as ibase
|
78 | 77 | from pandas.core.indexes.base import (
|
79 | 78 | Index,
|
@@ -2559,24 +2558,29 @@ def _convert_listlike_indexer(self, keyarr) -> np.ndarray | None:
|
2559 | 2558 |
|
2560 | 2559 | # are we indexing a specific level
|
2561 | 2560 | if len(keyarr) and not isinstance(keyarr[0], tuple):
|
2562 |
| - _, indexer = self.reindex(keyarr, level=0) |
2563 |
| - |
2564 |
| - # take all |
2565 |
| - if indexer is None: |
2566 |
| - indexer = np.arange(len(self), dtype=np.intp) |
2567 |
| - return indexer |
2568 |
| - |
2569 |
| - check = self.levels[0].get_indexer(keyarr) |
2570 |
| - mask = check == -1 |
| 2561 | + indexer = self._get_indexer_level_0(keyarr) |
| 2562 | + mask = indexer == -1 |
2571 | 2563 | if mask.any():
|
2572 |
| - raise KeyError(f"{keyarr[mask]} not in index") |
2573 |
| - elif is_empty_indexer(indexer, keyarr): |
| 2564 | + check = self.levels[0].get_indexer(keyarr) |
| 2565 | + cmask = check == -1 |
| 2566 | + if cmask.any(): |
| 2567 | + raise KeyError(f"{keyarr[cmask]} not in index") |
2574 | 2568 | # We get here when levels still contain values which are not
|
2575 | 2569 | # actually in Index anymore
|
2576 | 2570 | raise KeyError(f"{keyarr} not in index")
|
2577 | 2571 |
|
2578 | 2572 | return indexer
|
2579 | 2573 |
|
| 2574 | + def _get_indexer_level_0(self, target) -> np.ndarray: |
| 2575 | + """ |
| 2576 | + Optimized equivalent to `self.get_level_values(0).get_indexer_for(target)`. |
| 2577 | + """ |
| 2578 | + lev = self.levels[0] |
| 2579 | + codes = self._codes[0] |
| 2580 | + cat = Categorical.from_codes(codes=codes, categories=lev) |
| 2581 | + ci = Index(cat) |
| 2582 | + return ci.get_indexer_for(target) |
| 2583 | + |
2580 | 2584 | def _get_partial_string_timestamp_match_key(self, key):
|
2581 | 2585 | """
|
2582 | 2586 | Translate any partial string timestamp matches in key, returning the
|
|
0 commit comments