Skip to content

Commit df5e31a

Browse files
committed
Add series_tests
1 parent 964186b commit df5e31a

File tree

1 file changed

+123
-9
lines changed

1 file changed

+123
-9
lines changed

pandas/tests/series/test_alter_axes.py

+123-9
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,131 @@
1515

1616
class TestSeriesAlterAxes(object):
1717

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))]
2197

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)
25121

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)
29143

30144
# Renaming
31145

0 commit comments

Comments
 (0)