Skip to content

Commit 195cbef

Browse files
simonjayhawkinsjreback
authored andcommitted
REF/TST: Add more pytest idiom to indexing/multiindex/test_getitem.py (#24409)
1 parent 9f62f5e commit 195cbef

File tree

2 files changed

+87
-65
lines changed

2 files changed

+87
-65
lines changed

pandas/tests/indexing/multiindex/test_getitem.py

+62-64
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
from pandas.compat import lrange, range, u, zip
55

66
import pandas as pd
7-
from pandas import DataFrame, Index, MultiIndex, Series, date_range
7+
from pandas import DataFrame, Index, MultiIndex, Series
88
import pandas.core.common as com
9+
from pandas.core.indexing import IndexingError
910
from pandas.util import testing as tm
1011

1112

@@ -27,29 +28,6 @@ def test_series_getitem_multiindex(access_method, level1_value, expected):
2728
tm.assert_series_equal(result, expected)
2829

2930

30-
def test_series_getitem_multiindex_xs():
31-
# GH6258
32-
dt = list(date_range('20130903', periods=3))
33-
idx = MultiIndex.from_product([list('AB'), dt])
34-
s = Series([1, 3, 4, 1, 3, 4], index=idx)
35-
36-
result = s.xs('20130903', level=1)
37-
expected = Series([1, 1], index=list('AB'))
38-
tm.assert_series_equal(result, expected)
39-
40-
41-
def test_series_getitem_multiindex_xs_by_label():
42-
# GH5684
43-
idx = MultiIndex.from_tuples([('a', 'one'), ('a', 'two'), ('b', 'one'),
44-
('b', 'two')])
45-
s = Series([1, 2, 3, 4], index=idx)
46-
s.index.set_names(['L1', 'L2'], inplace=True)
47-
result = s.xs('one', level='L2')
48-
expected = Series([1, 3], index=['a', 'b'])
49-
expected.index.set_names(['L1'], inplace=True)
50-
tm.assert_series_equal(result, expected)
51-
52-
5331
@pytest.mark.parametrize('level0_value', ['D', 'A'])
5432
def test_getitem_duplicates_multiindex(level0_value):
5533
# GH 5725 the 'A' happens to be a valid Timestamp so the doesn't raise
@@ -145,63 +123,83 @@ def test_getitem_duplicates_multiindex_non_scalar_type_object():
145123

146124

147125
def test_getitem_simple(multiindex_dataframe_random_data):
148-
frame = multiindex_dataframe_random_data
149-
df = frame.T
150-
151-
col = df['foo', 'one']
152-
tm.assert_almost_equal(col.values, df.values[:, 0])
153-
msg = r"\('foo', 'four'\)"
154-
with pytest.raises(KeyError, match=msg):
155-
df[('foo', 'four')]
156-
msg = "'foobar'"
157-
with pytest.raises(KeyError, match=msg):
158-
df['foobar']
126+
df = multiindex_dataframe_random_data.T
127+
expected = df.values[:, 0]
128+
result = df['foo', 'one'].values
129+
tm.assert_almost_equal(result, expected)
159130

160131

161-
@pytest.mark.filterwarnings("ignore:\\n.ix:DeprecationWarning")
162-
def test_series_getitem(multiindex_year_month_day_dataframe_random_data):
163-
ymd = multiindex_year_month_day_dataframe_random_data
164-
s = ymd['A']
165-
166-
result = s[2000, 3]
132+
@pytest.mark.parametrize('indexer,msg', [
133+
(lambda df: df[('foo', 'four')], r"\('foo', 'four'\)"),
134+
(lambda df: df['foobar'], "'foobar'")
135+
])
136+
def test_getitem_simple_key_error(
137+
multiindex_dataframe_random_data, indexer, msg):
138+
df = multiindex_dataframe_random_data.T
139+
with pytest.raises(KeyError, match=msg):
140+
indexer(df)
167141

168-
# TODO(wesm): unused?
169-
# result2 = s.loc[2000, 3]
170142

143+
@pytest.mark.parametrize('indexer', [
144+
lambda s: s[2000, 3],
145+
lambda s: s.loc[2000, 3]
146+
])
147+
def test_series_getitem(
148+
multiindex_year_month_day_dataframe_random_data, indexer):
149+
s = multiindex_year_month_day_dataframe_random_data['A']
171150
expected = s.reindex(s.index[42:65])
172151
expected.index = expected.index.droplevel(0).droplevel(0)
152+
153+
result = indexer(s)
173154
tm.assert_series_equal(result, expected)
174155

175-
result = s[2000, 3, 10]
176-
expected = s[49]
156+
157+
@pytest.mark.parametrize('indexer', [
158+
lambda s: s[2000, 3, 10],
159+
lambda s: s.loc[2000, 3, 10]
160+
])
161+
def test_series_getitem_returns_scalar(
162+
multiindex_year_month_day_dataframe_random_data, indexer):
163+
s = multiindex_year_month_day_dataframe_random_data['A']
164+
expected = s.iloc[49]
165+
166+
result = indexer(s)
177167
assert result == expected
178168

179-
# fancy
169+
170+
@pytest.mark.filterwarnings("ignore:\\n.ix:DeprecationWarning")
171+
@pytest.mark.parametrize('indexer', [
172+
lambda s: s.loc[[(2000, 3, 10), (2000, 3, 13)]],
173+
lambda s: s.ix[[(2000, 3, 10), (2000, 3, 13)]]
174+
])
175+
def test_series_getitem_fancy(
176+
multiindex_year_month_day_dataframe_random_data, indexer):
177+
s = multiindex_year_month_day_dataframe_random_data['A']
180178
expected = s.reindex(s.index[49:51])
181-
result = s.loc[[(2000, 3, 10), (2000, 3, 13)]]
182-
tm.assert_series_equal(result, expected)
183179

184-
result = s.ix[[(2000, 3, 10), (2000, 3, 13)]]
180+
result = indexer(s)
185181
tm.assert_series_equal(result, expected)
186182

187-
# key error
188-
msg = "356"
189-
with pytest.raises(KeyError, match=msg):
190-
s.__getitem__((2000, 3, 4))
191-
192183

193-
def test_series_getitem_corner(
194-
multiindex_year_month_day_dataframe_random_data):
195-
ymd = multiindex_year_month_day_dataframe_random_data
196-
s = ymd['A']
184+
@pytest.mark.parametrize('indexer,error,msg', [
185+
(lambda s: s.__getitem__((2000, 3, 4)), KeyError, '356'),
186+
(lambda s: s[(2000, 3, 4)], KeyError, '356'),
187+
(lambda s: s.loc[(2000, 3, 4)], IndexingError, 'Too many indexers'),
188+
(lambda s: s.__getitem__(len(s)), IndexError, 'index out of bounds'),
189+
(lambda s: s[len(s)], IndexError, 'index out of bounds'),
190+
(lambda s: s.iloc[len(s)], IndexError,
191+
'single positional indexer is out-of-bounds')
192+
])
193+
def test_series_getitem_indexing_errors(
194+
multiindex_year_month_day_dataframe_random_data, indexer, error, msg):
195+
s = multiindex_year_month_day_dataframe_random_data['A']
196+
with pytest.raises(error, match=msg):
197+
indexer(s)
197198

198-
# don't segfault, GH #495
199-
# out of bounds access
200-
msg = "index out of bounds"
201-
with pytest.raises(IndexError, match=msg):
202-
s.__getitem__(len(ymd))
203199

204-
# generator
200+
def test_series_getitem_corner_generator(
201+
multiindex_year_month_day_dataframe_random_data):
202+
s = multiindex_year_month_day_dataframe_random_data['A']
205203
result = s[(x > 0 for x in s)]
206204
expected = s[s > 0]
207205
tm.assert_series_equal(result, expected)

pandas/tests/indexing/multiindex/test_xs.py

+25-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from pandas.compat import lrange, product as cart_product
55

6-
from pandas import DataFrame, Index, MultiIndex, concat
6+
from pandas import DataFrame, Index, MultiIndex, Series, concat, date_range
77
import pandas.core.common as com
88
from pandas.util import testing as tm
99

@@ -211,3 +211,27 @@ def test_xs_level_series_slice_not_implemented(
211211
msg = r'\(2000, slice\(3, 4, None\)\)'
212212
with pytest.raises(TypeError, match=msg):
213213
s[2000, 3:4]
214+
215+
216+
def test_series_getitem_multiindex_xs():
217+
# GH6258
218+
dt = list(date_range('20130903', periods=3))
219+
idx = MultiIndex.from_product([list('AB'), dt])
220+
s = Series([1, 3, 4, 1, 3, 4], index=idx)
221+
expected = Series([1, 1], index=list('AB'))
222+
223+
result = s.xs('20130903', level=1)
224+
tm.assert_series_equal(result, expected)
225+
226+
227+
def test_series_getitem_multiindex_xs_by_label():
228+
# GH5684
229+
idx = MultiIndex.from_tuples([('a', 'one'), ('a', 'two'), ('b', 'one'),
230+
('b', 'two')])
231+
s = Series([1, 2, 3, 4], index=idx)
232+
s.index.set_names(['L1', 'L2'], inplace=True)
233+
expected = Series([1, 3], index=['a', 'b'])
234+
expected.index.set_names(['L1'], inplace=True)
235+
236+
result = s.xs('one', level='L2')
237+
tm.assert_series_equal(result, expected)

0 commit comments

Comments
 (0)