diff --git a/pandas/tests/indexes/multi/test_reshape.py b/pandas/tests/indexes/multi/test_reshape.py index 0005e653694d8..eed27cd450e9c 100644 --- a/pandas/tests/indexes/multi/test_reshape.py +++ b/pandas/tests/indexes/multi/test_reshape.py @@ -71,6 +71,8 @@ def test_insert(idx): tm.assert_frame_equal(left, right, check_dtype=False) tm.assert_series_equal(ts, right["3rd"]) + +def test_insert2(): # GH9250 idx = ( [("test1", i) for i in range(5)] diff --git a/pandas/tests/indexing/test_indexing.py b/pandas/tests/indexing/test_indexing.py index 688f940e2b3fb..358689839d6af 100644 --- a/pandas/tests/indexing/test_indexing.py +++ b/pandas/tests/indexing/test_indexing.py @@ -712,8 +712,8 @@ def test_str_label_slicing_with_negative_step(self): ser, SLC[idx[9] : idx[13] : -1], SLC[:0] ) - def test_slice_with_zero_step_raises(self, indexer_sl, frame_or_series): - obj = frame_or_series(np.arange(20), index=_mklbl("A", 20)) + def test_slice_with_zero_step_raises(self, index, indexer_sl, frame_or_series): + obj = frame_or_series(np.arange(len(index)), index=index) with pytest.raises(ValueError, match="slice step cannot be zero"): indexer_sl(obj)[::0] diff --git a/pandas/tests/series/indexing/test_indexing.py b/pandas/tests/series/indexing/test_indexing.py index 8d0fba478bf66..31c21e123a0de 100644 --- a/pandas/tests/series/indexing/test_indexing.py +++ b/pandas/tests/series/indexing/test_indexing.py @@ -262,48 +262,6 @@ def test_preserve_refs(datetime_series): assert not np.isnan(datetime_series[10]) -def test_cast_on_putmask(): - # GH 2746 - - # need to upcast - s = Series([1, 2], index=[1, 2], dtype="int64") - s[[True, False]] = Series([0], index=[1], dtype="int64") - expected = Series([0, 2], index=[1, 2], dtype="int64") - - tm.assert_series_equal(s, expected) - - -def test_type_promote_putmask(): - # GH8387: test that changing types does not break alignment - ts = Series(np.random.randn(100), index=np.arange(100, 0, -1)).round(5) - left, mask = ts.copy(), ts > 0 - right = ts[mask].copy().map(str) - left[mask] = right - tm.assert_series_equal(left, ts.map(lambda t: str(t) if t > 0 else t)) - - -def test_setitem_mask_promote_strs(): - - ser = Series([0, 1, 2, 0]) - mask = ser > 0 - ser2 = ser[mask].map(str) - ser[mask] = ser2 - - expected = Series([0, "1", "2", 0]) - tm.assert_series_equal(ser, expected) - - -def test_setitem_mask_promote(): - - ser = Series([0, "foo", "bar", 0]) - mask = Series([False, True, True, False]) - ser2 = ser[mask] - ser[mask] = ser2 - - expected = Series([0, "foo", "bar", 0]) - tm.assert_series_equal(ser, expected) - - def test_multilevel_preserve_name(lexsorted_two_level_string_multiindex, indexer_sl): index = lexsorted_two_level_string_multiindex ser = Series(np.random.randn(len(index)), index=index, name="sth") @@ -317,13 +275,6 @@ def test_multilevel_preserve_name(lexsorted_two_level_string_multiindex, indexer """ -def test_slice_with_zero_step_raises(index, frame_or_series, indexer_sli): - ts = frame_or_series(np.arange(len(index)), index=index) - - with pytest.raises(ValueError, match="slice step cannot be zero"): - indexer_sli(ts)[::0] - - @pytest.mark.parametrize( "index", [ diff --git a/pandas/tests/series/indexing/test_mask.py b/pandas/tests/series/indexing/test_mask.py index dc4fb530dbb52..28235a8918e3f 100644 --- a/pandas/tests/series/indexing/test_mask.py +++ b/pandas/tests/series/indexing/test_mask.py @@ -37,15 +37,19 @@ def test_mask(): with pytest.raises(ValueError, match=msg): s.mask(cond[:3].values, -s) + +def test_mask_casts(): # dtype changes - s = Series([1, 2, 3, 4]) - result = s.mask(s > 2, np.nan) + ser = Series([1, 2, 3, 4]) + result = ser.mask(ser > 2, np.nan) expected = Series([1, 2, np.nan, np.nan]) tm.assert_series_equal(result, expected) + +def test_mask_casts2(): # see gh-21891 - s = Series([1, 2]) - res = s.mask([True, False]) + ser = Series([1, 2]) + res = ser.mask([True, False]) exp = Series([np.nan, 2]) tm.assert_series_equal(res, exp) diff --git a/pandas/tests/series/indexing/test_setitem.py b/pandas/tests/series/indexing/test_setitem.py index 2722bc26c4629..7082edb877ec1 100644 --- a/pandas/tests/series/indexing/test_setitem.py +++ b/pandas/tests/series/indexing/test_setitem.py @@ -234,6 +234,43 @@ def test_setitem_multiindex_slice(self, indexer_sli): class TestSetitemBooleanMask: + def test_setitem_mask_cast(self): + # GH#2746 + # need to upcast + ser = Series([1, 2], index=[1, 2], dtype="int64") + ser[[True, False]] = Series([0], index=[1], dtype="int64") + expected = Series([0, 2], index=[1, 2], dtype="int64") + + tm.assert_series_equal(ser, expected) + + def test_setitem_mask_align_and_promote(self): + # GH#8387: test that changing types does not break alignment + ts = Series(np.random.randn(100), index=np.arange(100, 0, -1)).round(5) + mask = ts > 0 + left = ts.copy() + right = ts[mask].copy().map(str) + left[mask] = right + expected = ts.map(lambda t: str(t) if t > 0 else t) + tm.assert_series_equal(left, expected) + + def test_setitem_mask_promote_strs(self): + ser = Series([0, 1, 2, 0]) + mask = ser > 0 + ser2 = ser[mask].map(str) + ser[mask] = ser2 + + expected = Series([0, "1", "2", 0]) + tm.assert_series_equal(ser, expected) + + def test_setitem_mask_promote(self): + ser = Series([0, "foo", "bar", 0]) + mask = Series([False, True, True, False]) + ser2 = ser[mask] + ser[mask] = ser2 + + expected = Series([0, "foo", "bar", 0]) + tm.assert_series_equal(ser, expected) + def test_setitem_boolean(self, string_series): mask = string_series > string_series.median()