@@ -282,56 +282,9 @@ def test_setitem_dt64_into_int_series(self, dtype):
282
282
tm .assert_series_equal (ser , expected )
283
283
284
284
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 :
333
286
"""
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 `
335
288
336
289
We assume that
337
290
- obj.index is the default Index(range(len(obj)))
@@ -346,26 +299,44 @@ def val(self, request):
346
299
"""
347
300
return request .param
348
301
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
+
349
307
def test_int_key (self , obj , key , expected , val , indexer_sli ):
350
308
if not isinstance (key , int ):
351
309
return
352
310
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 )
356
312
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 )
362
334
363
- def test_intlist_key (self , obj , key , expected , val , indexer_sli ):
364
335
ilkey = list (range (len (obj )))[key ]
336
+ self .check_indexer (obj , ilkey , expected , val , indexer_sli )
365
337
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 )
369
340
370
341
def test_mask_key (self , obj , key , expected , val , indexer_sli ):
371
342
# setitem with boolean mask
@@ -412,6 +383,63 @@ def test_index_putmask(self, obj, key, expected, val):
412
383
tm .assert_index_equal (res , Index (expected ))
413
384
414
385
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
+
415
443
class TestSetitemWithExpansion :
416
444
def test_setitem_empty_series (self ):
417
445
# GH#10193
0 commit comments