@@ -599,7 +599,7 @@ def _slice(self, obj, axis: int, kind=None):
599
599
600
600
def _get_setitem_indexer (self , key ):
601
601
if self .axis is not None :
602
- return self ._convert_tuple (key )
602
+ return self ._convert_tuple (key , setting = True )
603
603
604
604
ax = self .obj ._get_axis (0 )
605
605
@@ -612,15 +612,15 @@ def _get_setitem_indexer(self, key):
612
612
613
613
if isinstance (key , tuple ):
614
614
try :
615
- return self ._convert_tuple (key )
615
+ return self ._convert_tuple (key , setting = True )
616
616
except IndexingError :
617
617
pass
618
618
619
619
if isinstance (key , range ):
620
620
return list (key )
621
621
622
622
try :
623
- return self ._convert_to_indexer (key , axis = 0 )
623
+ return self ._convert_to_indexer (key , axis = 0 , setting = True )
624
624
except TypeError as e :
625
625
626
626
# invalid indexer type vs 'other' indexing errors
@@ -683,20 +683,22 @@ def _is_nested_tuple_indexer(self, tup: Tuple) -> bool:
683
683
return any (is_nested_tuple (tup , ax ) for ax in self .obj .axes )
684
684
return False
685
685
686
- def _convert_tuple (self , key ):
686
+ def _convert_tuple (self , key , setting : bool = False ):
687
687
keyidx = []
688
688
if self .axis is not None :
689
689
axis = self .obj ._get_axis_number (self .axis )
690
690
for i in range (self .ndim ):
691
691
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
+ )
693
695
else :
694
696
keyidx .append (slice (None ))
695
697
else :
696
698
for i , k in enumerate (key ):
697
699
if i >= self .ndim :
698
700
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 )
700
702
keyidx .append (idx )
701
703
return tuple (keyidx )
702
704
@@ -1566,7 +1568,7 @@ def _validate_read_indexer(
1566
1568
"https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike" # noqa:E501
1567
1569
)
1568
1570
1569
- def _convert_to_indexer (self , key , axis : int ):
1571
+ def _convert_to_indexer (self , key , axis : int , setting : bool = False ):
1570
1572
raise AbstractMethodError (self )
1571
1573
1572
1574
def __getitem__ (self , key ):
@@ -1775,7 +1777,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int):
1775
1777
# return a DatetimeIndex instead of a slice object.
1776
1778
return self .obj .take (indexer , axis = axis )
1777
1779
1778
- def _convert_to_indexer (self , key , axis : int ):
1780
+ def _convert_to_indexer (self , key , axis : int , setting : bool = False ):
1779
1781
"""
1780
1782
Convert indexing key into something we can use to do actual fancy
1781
1783
indexing on a ndarray.
@@ -1795,12 +1797,14 @@ def _convert_to_indexer(self, key, axis: int):
1795
1797
if isinstance (key , slice ):
1796
1798
return self ._convert_slice_indexer (key , axis )
1797
1799
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
1804
1808
1805
1809
# see if we are positional in nature
1806
1810
is_int_index = labels .is_integer ()
@@ -2032,7 +2036,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int):
2032
2036
indexer = self ._convert_slice_indexer (slice_obj , axis )
2033
2037
return self ._slice (indexer , axis = axis , kind = "iloc" )
2034
2038
2035
- def _convert_to_indexer (self , key , axis : int ):
2039
+ def _convert_to_indexer (self , key , axis : int , setting : bool = False ):
2036
2040
"""
2037
2041
Much simpler as we only have to deal with our valid types.
2038
2042
"""
0 commit comments