@@ -1127,17 +1127,44 @@ def test_where(self):
1127
1127
self .assertRaises (ValueError , s .__setitem__ , tuple ([[[True , False ]]]), [0 ,2 ,3 ])
1128
1128
self .assertRaises (ValueError , s .__setitem__ , tuple ([[[True , False ]]]), [])
1129
1129
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
+
1130
1156
# GH3235
1131
1157
s = Series (np .arange (10 ))
1132
1158
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 )
1136
1163
1137
1164
s = Series (np .arange (10 ))
1138
1165
mask = s > 5
1139
1166
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 )
1141
1168
assert_series_equal (s ,expected )
1142
1169
1143
1170
s = Series (np .arange (10 ))
@@ -3165,7 +3192,7 @@ def test_cast_on_putmask(self):
3165
3192
# need to upcast
3166
3193
s = Series ([1 ,2 ],index = [1 ,2 ],dtype = 'int64' )
3167
3194
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 ' )
3169
3196
3170
3197
assert_series_equal (s , expected )
3171
3198
0 commit comments