|
7 | 7 | @pytest.mark.parametrize(
|
8 | 8 | "values, dtype",
|
9 | 9 | [
|
| 10 | + ([], "object"), |
10 | 11 | ([1, 2, 3], "int64"),
|
11 | 12 | ([1.0, 2.0, 3.0], "float64"),
|
12 | 13 | (["a", "b", "c"], "object"),
|
|
25 | 26 | @pytest.mark.parametrize("indexer_class", [list, pd.array, pd.Index, pd.Series])
|
26 | 27 | @pytest.mark.parametrize("frame", [True, False])
|
27 | 28 | def test_series_mask_boolean(values, dtype, mask, indexer_class, frame):
|
28 |
| - ser = pd.Series(values, dtype=dtype, index=["a", "b", "c"]) |
29 |
| - if frame: |
30 |
| - ser = ser.to_frame() |
31 |
| - |
32 |
| - if indexer_class is pd.array: |
33 |
| - mask = pd.array(mask, dtype="boolean") |
34 |
| - elif indexer_class is pd.Series: |
35 |
| - mask = pd.Series(mask, index=ser.index) |
36 |
| - else: |
37 |
| - mask = indexer_class(mask) |
| 29 | + # In case len(values) < 3 |
| 30 | + index = ["a", "b", "c"][: len(values)] |
| 31 | + mask = mask[: len(values)] |
38 | 32 |
|
39 |
| - expected = ser[mask] |
40 |
| - |
41 |
| - result = ser[mask] |
42 |
| - tm.assert_equal(result, expected) |
43 |
| - |
44 |
| - msg = "iLocation based boolean indexing cannot use an indexable as a mask" |
45 |
| - if indexer_class is pd.Series: |
46 |
| - with pytest.raises(ValueError, match=msg): |
47 |
| - result = ser.iloc[mask] |
48 |
| - tm.assert_equal(result, expected) |
49 |
| - else: |
50 |
| - result = ser.iloc[mask] |
51 |
| - tm.assert_equal(result, expected) |
52 |
| - |
53 |
| - result = ser.loc[mask] |
54 |
| - tm.assert_equal(result, expected) |
55 |
| - |
56 |
| - |
57 |
| -@pytest.mark.parametrize( |
58 |
| - "dtype", |
59 |
| - [ |
60 |
| - "int64", |
61 |
| - "float64", |
62 |
| - "object", |
63 |
| - "string", |
64 |
| - "datetime64[ns]", |
65 |
| - "datetime64[ns, CET]", |
66 |
| - "timedelta64[ns]", |
67 |
| - "Period[D]", |
68 |
| - "Sparse", |
69 |
| - "interval", |
70 |
| - ], |
71 |
| -) |
72 |
| -@pytest.mark.parametrize("indexer_class", [list, pd.array, pd.Index, pd.Series]) |
73 |
| -@pytest.mark.parametrize("frame", [True, False]) |
74 |
| -def test_series_mask_boolean_empty(dtype, indexer_class, frame): |
| 33 | + obj = pd.Series(values, dtype=dtype, index=index) |
75 | 34 | if frame:
|
76 |
| - ser = pd.DataFrame(dtype=dtype) |
77 |
| - else: |
78 |
| - ser = pd.Series(dtype=dtype) |
| 35 | + if len(values) == 0: |
| 36 | + # Otherwise obj is an empty DataFrame with shape (0, 1) |
| 37 | + obj = pd.DataFrame(dtype=dtype) |
| 38 | + else: |
| 39 | + obj = obj.to_frame() |
79 | 40 |
|
80 |
| - mask = [] |
81 | 41 | if indexer_class is pd.array:
|
82 | 42 | mask = pd.array(mask, dtype="boolean")
|
83 | 43 | elif indexer_class is pd.Series:
|
84 |
| - mask = pd.Series(mask, index=ser.index, dtype="boolean") |
| 44 | + mask = pd.Series(mask, index=obj.index, dtype="boolean") |
85 | 45 | else:
|
86 | 46 | mask = indexer_class(mask)
|
87 | 47 |
|
88 |
| - expected = ser[mask] |
89 |
| - result = ser[mask] |
| 48 | + expected = obj[mask] |
| 49 | + |
| 50 | + result = obj[mask] |
90 | 51 | tm.assert_equal(result, expected)
|
91 | 52 |
|
92 |
| - msg = "iLocation based boolean indexing cannot use an indexable as a mask" |
93 | 53 | if indexer_class is pd.Series:
|
| 54 | + msg = "iLocation based boolean indexing cannot use an indexable as a mask" |
94 | 55 | with pytest.raises(ValueError, match=msg):
|
95 |
| - result = ser.iloc[mask] |
| 56 | + result = obj.iloc[mask] |
96 | 57 | tm.assert_equal(result, expected)
|
97 | 58 | else:
|
98 |
| - result = ser.iloc[mask] |
| 59 | + result = obj.iloc[mask] |
99 | 60 | tm.assert_equal(result, expected)
|
100 | 61 |
|
101 |
| - result = ser.loc[mask] |
| 62 | + result = obj.loc[mask] |
102 | 63 | tm.assert_equal(result, expected)
|
103 | 64 |
|
104 | 65 |
|
|
0 commit comments