@@ -833,21 +833,24 @@ def setitem(self, indexer, value):
833
833
834
834
else :
835
835
# current dtype cannot store value, coerce to common dtype
836
- find_dtype = False
837
836
838
837
if hasattr (value , "dtype" ):
839
838
dtype = value .dtype
840
- find_dtype = True
841
839
842
840
elif lib .is_scalar (value ) and not isna (value ):
843
841
dtype , _ = infer_dtype_from_scalar (value , pandas_dtype = True )
844
- find_dtype = True
845
842
846
- if find_dtype :
847
- dtype = find_common_type ([values .dtype , dtype ])
848
- if not is_dtype_equal (self .dtype , dtype ):
849
- b = self .astype (dtype )
850
- return b .setitem (indexer , value )
843
+ else :
844
+ # e.g. we are bool dtype and value is nan
845
+ # TODO: watch out for case with listlike value and scalar/empty indexer
846
+ dtype , _ = maybe_promote (np .array (value ).dtype )
847
+ return self .astype (dtype ).setitem (indexer , value )
848
+
849
+ dtype = find_common_type ([values .dtype , dtype ])
850
+ assert not is_dtype_equal (self .dtype , dtype )
851
+ # otherwise should have _can_hold_element
852
+
853
+ return self .astype (dtype ).setitem (indexer , value )
851
854
852
855
# value must be storeable at this moment
853
856
if is_extension_array_dtype (getattr (value , "dtype" , None )):
@@ -857,11 +860,6 @@ def setitem(self, indexer, value):
857
860
else :
858
861
arr_value = np .array (value )
859
862
860
- # cast the values to a type that can hold nan (if necessary)
861
- if not self ._can_hold_element (value ):
862
- dtype , _ = maybe_promote (arr_value .dtype )
863
- values = values .astype (dtype )
864
-
865
863
if transpose :
866
864
values = values .T
867
865
@@ -881,11 +879,7 @@ def setitem(self, indexer, value):
881
879
# be e.g. a list; see GH#6043
882
880
values [indexer ] = value
883
881
884
- elif (
885
- exact_match
886
- and is_categorical_dtype (arr_value .dtype )
887
- and not is_categorical_dtype (values )
888
- ):
882
+ elif exact_match and is_categorical_dtype (arr_value .dtype ):
889
883
# GH25495 - If the current dtype is not categorical,
890
884
# we need to create a new categorical block
891
885
values [indexer ] = value
0 commit comments