@@ -1061,6 +1061,10 @@ def __setitem__(self, key, value) -> None:
1061
1061
if key is Ellipsis :
1062
1062
key = slice (None )
1063
1063
1064
+ if isinstance (key , slice ):
1065
+ indexer = self .index ._convert_slice_indexer (key , kind = "getitem" )
1066
+ return self ._set_values (indexer , value )
1067
+
1064
1068
try :
1065
1069
self ._set_with_engine (key , value )
1066
1070
except (KeyError , ValueError ):
@@ -1074,6 +1078,7 @@ def __setitem__(self, key, value) -> None:
1074
1078
1075
1079
except (InvalidIndexError , TypeError ) as err :
1076
1080
if isinstance (key , tuple ) and not isinstance (self .index , MultiIndex ):
1081
+ # cases with MultiIndex don't get here bc they raise KeyError
1077
1082
raise KeyError (
1078
1083
"key of type tuple not found and not a MultiIndex"
1079
1084
) from err
@@ -1102,34 +1107,25 @@ def _set_with_engine(self, key, value) -> None:
1102
1107
1103
1108
def _set_with (self , key , value ):
1104
1109
# other: fancy integer or otherwise
1105
- if isinstance (key , slice ):
1106
- indexer = self .index ._convert_slice_indexer (key , kind = "getitem" )
1107
- return self ._set_values (indexer , value )
1108
-
1109
- else :
1110
- assert not isinstance (key , tuple )
1110
+ assert not isinstance (key , tuple )
1111
1111
1112
- if is_scalar (key ):
1113
- key = [key ]
1114
- elif is_iterator (key ):
1115
- # Without this, the call to infer_dtype will consume the generator
1116
- key = list (key )
1112
+ if is_scalar (key ):
1113
+ key = [key ]
1114
+ elif is_iterator (key ):
1115
+ # Without this, the call to infer_dtype will consume the generator
1116
+ key = list (key )
1117
1117
1118
- if isinstance (key , Index ):
1119
- key_type = key .inferred_type
1120
- key = key ._values
1121
- else :
1122
- key_type = lib .infer_dtype (key , skipna = False )
1118
+ key_type = lib .infer_dtype (key , skipna = False )
1123
1119
1124
- # Note: key_type == "boolean" should not occur because that
1125
- # should be caught by the is_bool_indexer check in __setitem__
1126
- if key_type == "integer" :
1127
- if not self .index ._should_fallback_to_positional :
1128
- self ._set_labels (key , value )
1129
- else :
1130
- self ._set_values (key , value )
1120
+ # Note: key_type == "boolean" should not occur because that
1121
+ # should be caught by the is_bool_indexer check in __setitem__
1122
+ if key_type == "integer" :
1123
+ if not self .index ._should_fallback_to_positional :
1124
+ self ._set_labels (key , value )
1131
1125
else :
1132
- self .loc [key ] = value
1126
+ self ._set_values (key , value )
1127
+ else :
1128
+ self .loc [key ] = value
1133
1129
1134
1130
def _set_labels (self , key , value ) -> None :
1135
1131
key = com .asarray_tuplesafe (key )
@@ -1140,7 +1136,7 @@ def _set_labels(self, key, value) -> None:
1140
1136
self ._set_values (indexer , value )
1141
1137
1142
1138
def _set_values (self , key , value ) -> None :
1143
- if isinstance (key , Series ):
1139
+ if isinstance (key , ( Index , Series ) ):
1144
1140
key = key ._values
1145
1141
1146
1142
self ._mgr = self ._mgr .setitem (indexer = key , value = value )
0 commit comments