@@ -282,56 +282,9 @@ def test_setitem_dt64_into_int_series(self, dtype):
282282 tm .assert_series_equal (ser , expected )
283283
284284
285- @pytest .mark .parametrize (
286- "obj,expected,key" ,
287- [
288- pytest .param (
289- # these induce dtype changes
290- Series ([2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]),
291- Series ([np .nan , 3 , np .nan , 5 , np .nan , 7 , np .nan , 9 , np .nan ]),
292- slice (None , None , 2 ),
293- id = "int_series_slice_key_step" ,
294- ),
295- pytest .param (
296- Series ([True , True , False , False ]),
297- Series ([np .nan , True , np .nan , False ], dtype = object ),
298- slice (None , None , 2 ),
299- id = "bool_series_slice_key_step" ,
300- ),
301- pytest .param (
302- # these induce dtype changes
303- Series (np .arange (10 )),
304- Series ([np .nan , np .nan , np .nan , np .nan , np .nan , 5 , 6 , 7 , 8 , 9 ]),
305- slice (None , 5 ),
306- id = "int_series_slice_key" ,
307- ),
308- pytest .param (
309- # changes dtype GH#4463
310- Series ([1 , 2 , 3 ]),
311- Series ([np .nan , 2 , 3 ]),
312- 0 ,
313- id = "int_series_int_key" ,
314- ),
315- pytest .param (
316- # changes dtype GH#4463
317- Series ([False ]),
318- Series ([np .nan ], dtype = object ),
319- # TODO: maybe go to float64 since we are changing the _whole_ Series?
320- 0 ,
321- id = "bool_series_int_key_change_all" ,
322- ),
323- pytest .param (
324- # changes dtype GH#4463
325- Series ([False , True ]),
326- Series ([np .nan , True ], dtype = object ),
327- 0 ,
328- id = "bool_series_int_key" ,
329- ),
330- ],
331- )
332- class TestSetitemCastingEquivalents :
285+ class SetitemCastingEquivalents :
333286 """
334- Check each of several methods that _should_ be equivalent to `obj[key] = np.nan `
287+ Check each of several methods that _should_ be equivalent to `obj[key] = val `
335288
336289 We assume that
337290 - obj.index is the default Index(range(len(obj)))
@@ -346,26 +299,44 @@ def val(self, request):
346299 """
347300 return request .param
348301
302+ def check_indexer (self , obj , key , expected , val , indexer ):
303+ obj = obj .copy ()
304+ indexer (obj )[key ] = val
305+ tm .assert_series_equal (obj , expected )
306+
349307 def test_int_key (self , obj , key , expected , val , indexer_sli ):
350308 if not isinstance (key , int ):
351309 return
352310
353- obj = obj .copy ()
354- indexer_sli (obj )[key ] = val
355- tm .assert_series_equal (obj , expected )
311+ self .check_indexer (obj , key , expected , val , indexer_sli )
356312
357- def test_slice_key (self , obj , key , expected , val , indexer_si ):
358- # Note: no .loc because that handles slice edges differently
359- obj = obj .copy ()
360- indexer_si (obj )[key ] = val
361- tm .assert_series_equal (obj , expected )
313+ rng = range (key , key + 1 )
314+ self .check_indexer (obj , rng , expected , val , indexer_sli )
315+
316+ if indexer_sli is not tm .loc :
317+ # Note: no .loc because that handles slice edges differently
318+ slc = slice (key , key + 1 )
319+ self .check_indexer (obj , slc , expected , val , indexer_sli )
320+
321+ ilkey = [key ]
322+ self .check_indexer (obj , ilkey , expected , val , indexer_sli )
323+
324+ indkey = np .array (ilkey )
325+ self .check_indexer (obj , indkey , expected , val , indexer_sli )
326+
327+ def test_slice_key (self , obj , key , expected , val , indexer_sli ):
328+ if not isinstance (key , slice ):
329+ return
330+
331+ if indexer_sli is not tm .loc :
332+ # Note: no .loc because that handles slice edges differently
333+ self .check_indexer (obj , key , expected , val , indexer_sli )
362334
363- def test_intlist_key (self , obj , key , expected , val , indexer_sli ):
364335 ilkey = list (range (len (obj )))[key ]
336+ self .check_indexer (obj , ilkey , expected , val , indexer_sli )
365337
366- obj = obj .copy ()
367- indexer_sli (obj )[ilkey ] = val
368- tm .assert_series_equal (obj , expected )
338+ indkey = np .array (ilkey )
339+ self .check_indexer (obj , indkey , expected , val , indexer_sli )
369340
370341 def test_mask_key (self , obj , key , expected , val , indexer_sli ):
371342 # setitem with boolean mask
@@ -412,6 +383,63 @@ def test_index_putmask(self, obj, key, expected, val):
412383 tm .assert_index_equal (res , Index (expected ))
413384
414385
386+ @pytest .mark .parametrize (
387+ "obj,expected,key" ,
388+ [
389+ pytest .param (
390+ # these induce dtype changes
391+ Series ([2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]),
392+ Series ([np .nan , 3 , np .nan , 5 , np .nan , 7 , np .nan , 9 , np .nan ]),
393+ slice (None , None , 2 ),
394+ id = "int_series_slice_key_step" ,
395+ ),
396+ pytest .param (
397+ Series ([True , True , False , False ]),
398+ Series ([np .nan , True , np .nan , False ], dtype = object ),
399+ slice (None , None , 2 ),
400+ id = "bool_series_slice_key_step" ,
401+ ),
402+ pytest .param (
403+ # these induce dtype changes
404+ Series (np .arange (10 )),
405+ Series ([np .nan , np .nan , np .nan , np .nan , np .nan , 5 , 6 , 7 , 8 , 9 ]),
406+ slice (None , 5 ),
407+ id = "int_series_slice_key" ,
408+ ),
409+ pytest .param (
410+ # changes dtype GH#4463
411+ Series ([1 , 2 , 3 ]),
412+ Series ([np .nan , 2 , 3 ]),
413+ 0 ,
414+ id = "int_series_int_key" ,
415+ ),
416+ pytest .param (
417+ # changes dtype GH#4463
418+ Series ([False ]),
419+ Series ([np .nan ], dtype = object ),
420+ # TODO: maybe go to float64 since we are changing the _whole_ Series?
421+ 0 ,
422+ id = "bool_series_int_key_change_all" ,
423+ ),
424+ pytest .param (
425+ # changes dtype GH#4463
426+ Series ([False , True ]),
427+ Series ([np .nan , True ], dtype = object ),
428+ 0 ,
429+ id = "bool_series_int_key" ,
430+ ),
431+ ],
432+ )
433+ class TestSetitemCastingEquivalents (SetitemCastingEquivalents ):
434+ @pytest .fixture (params = [np .nan , np .float64 ("NaN" )])
435+ def val (self , request ):
436+ """
437+ One python float NaN, one np.float64. Only np.float64 has a `dtype`
438+ attribute.
439+ """
440+ return request .param
441+
442+
415443class TestSetitemWithExpansion :
416444 def test_setitem_empty_series (self ):
417445 # GH#10193
0 commit comments