|
15 | 15 |
|
16 | 16 | class TestSeriesAlterAxes(object):
|
17 | 17 |
|
18 |
| - def test_setindex(self, string_series): |
19 |
| - # wrong type |
20 |
| - pytest.raises(TypeError, setattr, string_series, 'index', None) |
| 18 | + def test_set_index_directly(self, string_series): |
| 19 | + idx = Index(np.arange(len(string_series))[::-1]) |
| 20 | + |
| 21 | + string_series.index = idx |
| 22 | + tm.assert_index_equal(string_series.index, idx) |
| 23 | + with tm.assert_raises_regex(ValueError, 'Length mismatch'): |
| 24 | + string_series.index = idx[::2] |
| 25 | + |
| 26 | + # MultiIndex constructor does not work directly on Series -> lambda |
| 27 | + @pytest.mark.parametrize('box', [Series, Index, np.array, |
| 28 | + lambda x: MultiIndex.from_arrays([x])]) |
| 29 | + @pytest.mark.parametrize('inplace', [True, False]) |
| 30 | + def test_set_index(self, string_series, inplace, box): |
| 31 | + idx = box(string_series.index[::-1]) |
| 32 | + |
| 33 | + expected = Index(string_series.index[::-1]) |
| 34 | + |
| 35 | + if inplace: |
| 36 | + result = string_series.copy() |
| 37 | + result.set_index(idx, inplace=True) |
| 38 | + else: |
| 39 | + result = string_series.set_index(idx) |
| 40 | + |
| 41 | + tm.assert_index_equal(result.index, expected) |
| 42 | + with tm.assert_raises_regex(ValueError, 'Length mismatch'): |
| 43 | + string_series.set_index(idx[::2], inplace=inplace) |
| 44 | + |
| 45 | + def test_set_index_cast(self): |
| 46 | + # issue casting an index then set_index |
| 47 | + s = Series([1.1, 2.2, 3.3], index=[2010, 2011, 2012]) |
| 48 | + s2 = s.set_index(s.index.astype(np.int32)) |
| 49 | + tm.assert_series_equal(s, s2) |
| 50 | + |
| 51 | + # MultiIndex constructor does not work directly on Series -> lambda |
| 52 | + # also test index name if append=True (name is duplicate here for B) |
| 53 | + @pytest.mark.parametrize('box', [Series, Index, np.array, |
| 54 | + lambda x: MultiIndex.from_arrays([x])]) |
| 55 | + @pytest.mark.parametrize('index_name', [None, 'B', 'test']) |
| 56 | + def test_set_index_append(self, string_series, index_name, box): |
| 57 | + string_series.index.name = index_name |
| 58 | + |
| 59 | + arrays = box(string_series.index[::-1]) |
| 60 | + # np.array and list "forget" the name of series.index |
| 61 | + names = [index_name, None if box in [np.array, list] else index_name] |
| 62 | + |
| 63 | + idx = MultiIndex.from_arrays([string_series.index, |
| 64 | + string_series.index[::-1]], |
| 65 | + names=names) |
| 66 | + expected = string_series.copy() |
| 67 | + expected.index = idx |
| 68 | + |
| 69 | + result = string_series.set_index(arrays, append=True) |
| 70 | + |
| 71 | + tm.assert_series_equal(result, expected) |
| 72 | + |
| 73 | + def test_set_index_append_to_multiindex(self, string_series): |
| 74 | + s = string_series.set_index(string_series.index[::-1], append=True) |
| 75 | + |
| 76 | + idx = np.random.randn(len(s)) |
| 77 | + expected = string_series.set_index([string_series.index[::-1], idx], |
| 78 | + append=True) |
| 79 | + |
| 80 | + result = s.set_index(idx, append=True) |
| 81 | + |
| 82 | + tm.assert_series_equal(result, expected) |
| 83 | + |
| 84 | + # MultiIndex constructor does not work directly on Series -> lambda |
| 85 | + # also test index name if append=True (name is duplicate here for A & B) |
| 86 | + @pytest.mark.parametrize('box', [Series, Index, np.array, list, |
| 87 | + lambda x: MultiIndex.from_arrays([x])]) |
| 88 | + @pytest.mark.parametrize('append, index_name', [(True, None), (True, 'B'), |
| 89 | + (True, 'test'), (False, None)]) |
| 90 | + def test_set_index_pass_arrays(self, string_series, append, |
| 91 | + index_name, box): |
| 92 | + string_series.index.name = index_name |
| 93 | + |
| 94 | + idx = string_series.index[::-1] |
| 95 | + idx.name = 'B' |
| 96 | + arrays = [box(idx), np.random.randn(len(string_series))] |
21 | 97 |
|
22 |
| - # wrong length |
23 |
| - pytest.raises(Exception, setattr, string_series, 'index', |
24 |
| - np.arange(len(string_series) - 1)) |
| 98 | + result = string_series.set_index(arrays, append=append) |
| 99 | + |
| 100 | + # to test against already-tested behavior, we add sequentially, |
| 101 | + # hence second append always True |
| 102 | + expected = string_series.set_index(arrays[0], append=append) |
| 103 | + expected = expected.set_index(arrays[1], append=True) |
| 104 | + |
| 105 | + tm.assert_series_equal(result, expected) |
| 106 | + |
| 107 | + @pytest.mark.parametrize('append', [True, False]) |
| 108 | + def test_set_index_pass_multiindex(self, string_series, append): |
| 109 | + arrays = MultiIndex.from_arrays([string_series.values, |
| 110 | + string_series.index[::-1]], |
| 111 | + names=['A', 'B']) |
| 112 | + |
| 113 | + result = string_series.set_index(arrays, append=append) |
| 114 | + |
| 115 | + expected = string_series.set_index([string_series.values, |
| 116 | + string_series.index[::-1]], |
| 117 | + append=append) |
| 118 | + expected.index.names = [None, 'A', 'B'] if append else ['A', 'B'] |
| 119 | + |
| 120 | + tm.assert_series_equal(result, expected) |
25 | 121 |
|
26 |
| - # works |
27 |
| - string_series.index = np.arange(len(string_series)) |
28 |
| - assert isinstance(string_series.index, Index) |
| 122 | + def test_set_index_verify_integrity(self, string_series): |
| 123 | + idx = np.zeros(len(string_series)) |
| 124 | + |
| 125 | + with tm.assert_raises_regex(ValueError, |
| 126 | + 'Index has duplicate keys'): |
| 127 | + string_series.set_index(idx, verify_integrity=True) |
| 128 | + # with MultiIndex |
| 129 | + with tm.assert_raises_regex(ValueError, |
| 130 | + 'Index has duplicate keys'): |
| 131 | + string_series.set_index([idx, idx], verify_integrity=True) |
| 132 | + |
| 133 | + def test_set_index_raise(self, string_series): |
| 134 | + # wrong type: iterator |
| 135 | + with tm.assert_raises_regex(TypeError, 'arrays must be.*'): |
| 136 | + string_series.set_index(iter(string_series.index), |
| 137 | + verify_integrity=True) |
| 138 | + |
| 139 | + # wrong type in list with arrays |
| 140 | + with tm.assert_raises_regex(TypeError, 'arrays must be.*'): |
| 141 | + string_series.set_index([string_series.index, 'X'], |
| 142 | + verify_integrity=True) |
29 | 143 |
|
30 | 144 | # Renaming
|
31 | 145 |
|
|
0 commit comments