Skip to content

Commit f42be06

Browse files
authored
TST/REF: SetitemCastingEquivalents (#39477)
1 parent e3c95db commit f42be06

File tree

1 file changed

+89
-61
lines changed

1 file changed

+89
-61
lines changed

pandas/tests/series/indexing/test_setitem.py

+89-61
Original file line numberDiff line numberDiff line change
@@ -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+
415443
class TestSetitemWithExpansion:
416444
def test_setitem_empty_series(self):
417445
# GH#10193

0 commit comments

Comments
 (0)