Skip to content

Commit a0e79d2

Browse files
authored
REF: remove Index._convert_arr_indexer (#41884)
1 parent 3ca84fc commit a0e79d2

File tree

3 files changed

+26
-55
lines changed

3 files changed

+26
-55
lines changed

pandas/core/indexes/base.py

-37
Original file line numberDiff line numberDiff line change
@@ -3664,43 +3664,6 @@ def is_int(v):
36643664

36653665
return indexer
36663666

3667-
def _convert_listlike_indexer(self, keyarr):
3668-
"""
3669-
Parameters
3670-
----------
3671-
keyarr : list-like
3672-
Indexer to convert.
3673-
3674-
Returns
3675-
-------
3676-
indexer : numpy.ndarray or None
3677-
Return an ndarray or None if cannot convert.
3678-
keyarr : numpy.ndarray
3679-
Return tuple-safe keys.
3680-
"""
3681-
if isinstance(keyarr, Index):
3682-
pass
3683-
else:
3684-
keyarr = self._convert_arr_indexer(keyarr)
3685-
3686-
indexer = None
3687-
return indexer, keyarr
3688-
3689-
def _convert_arr_indexer(self, keyarr) -> np.ndarray:
3690-
"""
3691-
Convert an array-like indexer to the appropriate dtype.
3692-
3693-
Parameters
3694-
----------
3695-
keyarr : array-like
3696-
Indexer to convert.
3697-
3698-
Returns
3699-
-------
3700-
converted_keyarr : array-like
3701-
"""
3702-
return com.asarray_tuplesafe(keyarr)
3703-
37043667
@final
37053668
def _invalid_indexer(self, form: str_t, key) -> TypeError:
37063669
"""

pandas/core/indexes/multi.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -2581,29 +2581,29 @@ def _get_values_for_loc(self, series: Series, loc, key):
25812581
new_ser = series._constructor(new_values, index=new_index, name=series.name)
25822582
return new_ser.__finalize__(series)
25832583

2584-
def _convert_listlike_indexer(self, keyarr):
2584+
def _convert_listlike_indexer(self, keyarr) -> np.ndarray | None:
25852585
"""
2586+
Analogous to get_indexer when we are partial-indexing on our first level.
2587+
25862588
Parameters
25872589
----------
2588-
keyarr : list-like
2590+
keyarr : Index, np.ndarray, or ExtensionArray
25892591
Indexer to convert.
25902592
25912593
Returns
25922594
-------
2593-
tuple (indexer, keyarr)
2594-
indexer is an ndarray or None if cannot convert
2595-
keyarr are tuple-safe keys
2595+
np.ndarray[intp] or None
25962596
"""
2597-
indexer, keyarr = super()._convert_listlike_indexer(keyarr)
2597+
indexer = None
25982598

25992599
# are we indexing a specific level
2600-
if indexer is None and len(keyarr) and not isinstance(keyarr[0], tuple):
2601-
level = 0
2602-
_, indexer = self.reindex(keyarr, level=level)
2600+
if len(keyarr) and not isinstance(keyarr[0], tuple):
2601+
_, indexer = self.reindex(keyarr, level=0)
26032602

26042603
# take all
26052604
if indexer is None:
2606-
indexer = np.arange(len(self))
2605+
indexer = np.arange(len(self), dtype=np.intp)
2606+
return indexer
26072607

26082608
check = self.levels[0].get_indexer(keyarr)
26092609
mask = check == -1
@@ -2614,7 +2614,7 @@ def _convert_listlike_indexer(self, keyarr):
26142614
# actually in Index anymore
26152615
raise KeyError(f"{keyarr} not in index")
26162616

2617-
return indexer, keyarr
2617+
return indexer
26182618

26192619
def _get_partial_string_timestamp_match_key(self, key):
26202620
"""

pandas/core/indexing.py

+15-7
Original file line numberDiff line numberDiff line change
@@ -1286,13 +1286,21 @@ def _get_listlike_indexer(self, key, axis: int):
12861286
"""
12871287
ax = self.obj._get_axis(axis)
12881288

1289-
# Have the index compute an indexer or return None
1290-
# if it cannot handle:
1291-
indexer, keyarr = ax._convert_listlike_indexer(key)
1292-
# We only act on all found values:
1293-
if indexer is not None and (indexer != -1).all():
1294-
# _validate_read_indexer is a no-op if no -1s, so skip
1295-
return ax[indexer], indexer
1289+
keyarr = key
1290+
if not isinstance(keyarr, Index):
1291+
keyarr = com.asarray_tuplesafe(keyarr)
1292+
1293+
if isinstance(ax, MultiIndex):
1294+
# get_indexer expects a MultiIndex or sequence of tuples, but
1295+
# we may be doing partial-indexing, so need an extra check
1296+
1297+
# Have the index compute an indexer or return None
1298+
# if it cannot handle:
1299+
indexer = ax._convert_listlike_indexer(keyarr)
1300+
# We only act on all found values:
1301+
if indexer is not None and (indexer != -1).all():
1302+
# _validate_read_indexer is a no-op if no -1s, so skip
1303+
return ax[indexer], indexer
12961304

12971305
if ax._index_as_unique:
12981306
indexer = ax.get_indexer_for(keyarr)

0 commit comments

Comments
 (0)