@@ -1127,17 +1127,44 @@ def test_where(self):
11271127 self .assertRaises (ValueError , s .__setitem__ , tuple ([[[True , False ]]]), [0 ,2 ,3 ])
11281128 self .assertRaises (ValueError , s .__setitem__ , tuple ([[[True , False ]]]), [])
11291129
1130+ # unsafe dtype changes
1131+ for dtype in [ np .int8 , np .int16 , np .int32 , np .int64 , np .float16 , np .float32 , np .float64 ]:
1132+ s = Series (np .arange (10 ), dtype = dtype )
1133+ mask = s < 5
1134+ s [mask ] = range (2 ,7 )
1135+ expected = Series (range (2 ,7 ) + range (5 ,10 ), dtype = dtype )
1136+ assert_series_equal (s , expected )
1137+ self .assertEquals (s .dtype , expected .dtype )
1138+
1139+ # these are allowed operations, but are upcasted
1140+ for dtype in [ np .int64 , np .float64 ]:
1141+ s = Series (np .arange (10 ), dtype = dtype )
1142+ mask = s < 5
1143+ values = [2.5 ,3.5 ,4.5 ,5.5 ,6.5 ]
1144+ s [mask ] = values
1145+ expected = Series (values + range (5 ,10 ), dtype = 'float64' )
1146+ assert_series_equal (s , expected )
1147+ self .assertEquals (s .dtype , expected .dtype )
1148+
1149+ # can't do these as we are forced to change the itemsize of the input to something we cannot
1150+ for dtype in [ np .int8 , np .int16 , np .int32 , np .float16 , np .float32 ]:
1151+ s = Series (np .arange (10 ), dtype = dtype )
1152+ mask = s < 5
1153+ values = [2.5 ,3.5 ,4.5 ,5.5 ,6.5 ]
1154+ self .assertRaises (Exception , s .__setitem__ , tuple (mask ), values )
1155+
11301156 # GH3235
11311157 s = Series (np .arange (10 ))
11321158 mask = s < 5
1133- s [mask ] = range (5 )
1134- expected = Series (np .arange (10 ),dtype = 'float64' )
1135- assert_series_equal (s ,expected )
1159+ s [mask ] = range (2 ,7 )
1160+ expected = Series (range (2 ,7 ) + range (5 ,10 ))
1161+ assert_series_equal (s , expected )
1162+ self .assertEquals (s .dtype , expected .dtype )
11361163
11371164 s = Series (np .arange (10 ))
11381165 mask = s > 5
11391166 s [mask ] = [0 ]* 4
1140- expected = Series ([0 ,1 ,2 ,3 ,4 ,5 ] + [0 ]* 4 , dtype = 'float64' )
1167+ expected = Series ([0 ,1 ,2 ,3 ,4 ,5 ] + [0 ]* 4 )
11411168 assert_series_equal (s ,expected )
11421169
11431170 s = Series (np .arange (10 ))
@@ -3165,7 +3192,7 @@ def test_cast_on_putmask(self):
31653192 # need to upcast
31663193 s = Series ([1 ,2 ],index = [1 ,2 ],dtype = 'int64' )
31673194 s [[True , False ]] = Series ([0 ],index = [1 ],dtype = 'int64' )
3168- expected = Series ([0 ,2 ],index = [1 ,2 ],dtype = 'float64 ' )
3195+ expected = Series ([0 ,2 ],index = [1 ,2 ],dtype = 'int64 ' )
31693196
31703197 assert_series_equal (s , expected )
31713198
0 commit comments