Skip to content

Commit 1d5d5a3

Browse files
authored
REF: make _convert_scalar_indexer require a scalar (#31676)
1 parent 69fe3c0 commit 1d5d5a3

File tree

2 files changed

+29
-23
lines changed

2 files changed

+29
-23
lines changed

pandas/core/indexes/datetimelike.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -398,15 +398,17 @@ def _convert_scalar_indexer(self, key, kind=None):
398398

399399
assert kind in ["loc", "getitem", "iloc", None]
400400

401+
if not is_scalar(key):
402+
raise TypeError(key)
403+
401404
# we don't allow integer/float indexing for loc
402-
# we don't allow float indexing for ix/getitem
403-
if is_scalar(key):
404-
is_int = is_integer(key)
405-
is_flt = is_float(key)
406-
if kind in ["loc"] and (is_int or is_flt):
407-
self._invalid_indexer("index", key)
408-
elif kind in ["getitem"] and is_flt:
409-
self._invalid_indexer("index", key)
405+
# we don't allow float indexing for getitem
406+
is_int = is_integer(key)
407+
is_flt = is_float(key)
408+
if kind == "loc" and (is_int or is_flt):
409+
self._invalid_indexer("index", key)
410+
elif kind == "getitem" and is_flt:
411+
self._invalid_indexer("index", key)
410412

411413
return super()._convert_scalar_indexer(key, kind=kind)
412414

pandas/core/indexing.py

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ def _slice(self, obj, axis: int, kind=None):
599599

600600
def _get_setitem_indexer(self, key):
601601
if self.axis is not None:
602-
return self._convert_tuple(key)
602+
return self._convert_tuple(key, setting=True)
603603

604604
ax = self.obj._get_axis(0)
605605

@@ -612,15 +612,15 @@ def _get_setitem_indexer(self, key):
612612

613613
if isinstance(key, tuple):
614614
try:
615-
return self._convert_tuple(key)
615+
return self._convert_tuple(key, setting=True)
616616
except IndexingError:
617617
pass
618618

619619
if isinstance(key, range):
620620
return list(key)
621621

622622
try:
623-
return self._convert_to_indexer(key, axis=0)
623+
return self._convert_to_indexer(key, axis=0, setting=True)
624624
except TypeError as e:
625625

626626
# invalid indexer type vs 'other' indexing errors
@@ -683,20 +683,22 @@ def _is_nested_tuple_indexer(self, tup: Tuple) -> bool:
683683
return any(is_nested_tuple(tup, ax) for ax in self.obj.axes)
684684
return False
685685

686-
def _convert_tuple(self, key):
686+
def _convert_tuple(self, key, setting: bool = False):
687687
keyidx = []
688688
if self.axis is not None:
689689
axis = self.obj._get_axis_number(self.axis)
690690
for i in range(self.ndim):
691691
if i == axis:
692-
keyidx.append(self._convert_to_indexer(key, axis=axis))
692+
keyidx.append(
693+
self._convert_to_indexer(key, axis=axis, setting=setting)
694+
)
693695
else:
694696
keyidx.append(slice(None))
695697
else:
696698
for i, k in enumerate(key):
697699
if i >= self.ndim:
698700
raise IndexingError("Too many indexers")
699-
idx = self._convert_to_indexer(k, axis=i)
701+
idx = self._convert_to_indexer(k, axis=i, setting=setting)
700702
keyidx.append(idx)
701703
return tuple(keyidx)
702704

@@ -1566,7 +1568,7 @@ def _validate_read_indexer(
15661568
"https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike" # noqa:E501
15671569
)
15681570

1569-
def _convert_to_indexer(self, key, axis: int):
1571+
def _convert_to_indexer(self, key, axis: int, setting: bool = False):
15701572
raise AbstractMethodError(self)
15711573

15721574
def __getitem__(self, key):
@@ -1775,7 +1777,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int):
17751777
# return a DatetimeIndex instead of a slice object.
17761778
return self.obj.take(indexer, axis=axis)
17771779

1778-
def _convert_to_indexer(self, key, axis: int):
1780+
def _convert_to_indexer(self, key, axis: int, setting: bool = False):
17791781
"""
17801782
Convert indexing key into something we can use to do actual fancy
17811783
indexing on a ndarray.
@@ -1795,12 +1797,14 @@ def _convert_to_indexer(self, key, axis: int):
17951797
if isinstance(key, slice):
17961798
return self._convert_slice_indexer(key, axis)
17971799

1798-
# try to find out correct indexer, if not type correct raise
1799-
try:
1800-
key = self._convert_scalar_indexer(key, axis)
1801-
except TypeError:
1802-
# but we will allow setting
1803-
pass
1800+
if is_scalar(key):
1801+
# try to find out correct indexer, if not type correct raise
1802+
try:
1803+
key = self._convert_scalar_indexer(key, axis)
1804+
except TypeError:
1805+
# but we will allow setting
1806+
if not setting:
1807+
raise
18041808

18051809
# see if we are positional in nature
18061810
is_int_index = labels.is_integer()
@@ -2032,7 +2036,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int):
20322036
indexer = self._convert_slice_indexer(slice_obj, axis)
20332037
return self._slice(indexer, axis=axis, kind="iloc")
20342038

2035-
def _convert_to_indexer(self, key, axis: int):
2039+
def _convert_to_indexer(self, key, axis: int, setting: bool = False):
20362040
"""
20372041
Much simpler as we only have to deal with our valid types.
20382042
"""

0 commit comments

Comments
 (0)