Skip to content

Commit aa3303a

Browse files
simonjayhawkinsPingviinituutti
authored andcommitted
REF/TST: Add more pytest idiom to indexing/multiindex/test_iloc.py (pandas-dev#24272)
1 parent ce26e78 commit aa3303a

File tree

1 file changed

+110
-122
lines changed

1 file changed

+110
-122
lines changed
+110-122
Original file line numberDiff line numberDiff line change
@@ -1,129 +1,117 @@
1-
from warnings import catch_warnings
2-
31
import numpy as np
42
import pytest
53

64
from pandas import DataFrame, MultiIndex, Series
75
from pandas.util import testing as tm
86

97

10-
@pytest.mark.filterwarnings("ignore:\\n.ix:DeprecationWarning")
11-
class TestMultiIndexIloc(object):
12-
13-
def test_iloc_getitem_multiindex2(self):
14-
# TODO(wesm): fix this
15-
pytest.skip('this test was being suppressed, '
16-
'needs to be fixed')
17-
18-
arr = np.random.randn(3, 3)
19-
df = DataFrame(arr, columns=[[2, 2, 4], [6, 8, 10]],
20-
index=[[4, 4, 8], [8, 10, 12]])
21-
22-
rs = df.iloc[2]
23-
xp = Series(arr[2], index=df.columns)
24-
tm.assert_series_equal(rs, xp)
25-
26-
rs = df.iloc[:, 2]
27-
xp = Series(arr[:, 2], index=df.index)
28-
tm.assert_series_equal(rs, xp)
29-
30-
rs = df.iloc[2, 2]
31-
xp = df.values[2, 2]
32-
assert rs == xp
33-
34-
# for multiple items
35-
# GH 5528
36-
rs = df.iloc[[0, 1]]
37-
xp = df.xs(4, drop_level=False)
38-
tm.assert_frame_equal(rs, xp)
39-
40-
tup = zip(*[['a', 'a', 'b', 'b'], ['x', 'y', 'x', 'y']])
41-
index = MultiIndex.from_tuples(tup)
42-
df = DataFrame(np.random.randn(4, 4), index=index)
43-
rs = df.iloc[[2, 3]]
44-
xp = df.xs('b', drop_level=False)
45-
tm.assert_frame_equal(rs, xp)
46-
47-
def test_iloc_getitem_multiindex(self):
48-
mi_labels = DataFrame(np.random.randn(4, 3),
49-
columns=[['i', 'i', 'j'], ['A', 'A', 'B']],
50-
index=[['i', 'i', 'j', 'k'],
51-
['X', 'X', 'Y', 'Y']])
52-
53-
mi_int = DataFrame(np.random.randn(3, 3),
54-
columns=[[2, 2, 4], [6, 8, 10]],
55-
index=[[4, 4, 8], [8, 10, 12]])
56-
57-
# the first row
58-
rs = mi_int.iloc[0]
59-
with catch_warnings(record=True):
60-
xp = mi_int.ix[4].ix[8]
61-
tm.assert_series_equal(rs, xp, check_names=False)
62-
assert rs.name == (4, 8)
63-
assert xp.name == 8
64-
65-
# 2nd (last) columns
66-
rs = mi_int.iloc[:, 2]
67-
with catch_warnings(record=True):
68-
xp = mi_int.ix[:, 2]
69-
tm.assert_series_equal(rs, xp)
70-
71-
# corner column
72-
rs = mi_int.iloc[2, 2]
73-
with catch_warnings(record=True):
74-
# First level is int - so use .loc rather than .ix (GH 21593)
75-
xp = mi_int.loc[(8, 12), (4, 10)]
76-
assert rs == xp
77-
78-
# this is basically regular indexing
79-
rs = mi_labels.iloc[2, 2]
80-
with catch_warnings(record=True):
81-
xp = mi_labels.ix['j'].ix[:, 'j'].ix[0, 0]
82-
assert rs == xp
83-
84-
def test_frame_getitem_setitem_slice(
85-
self, multiindex_dataframe_random_data):
86-
frame = multiindex_dataframe_random_data
87-
# getitem
88-
result = frame.iloc[:4]
89-
expected = frame[:4]
90-
tm.assert_frame_equal(result, expected)
91-
92-
# setitem
93-
cp = frame.copy()
94-
cp.iloc[:4] = 0
95-
96-
assert (cp.values[:4] == 0).all()
97-
assert (cp.values[4:] != 0).all()
98-
99-
def test_indexing_ambiguity_bug_1678(self):
100-
columns = MultiIndex.from_tuples([('Ohio', 'Green'), ('Ohio', 'Red'), (
101-
'Colorado', 'Green')])
102-
index = MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1), ('b', 2)
103-
])
104-
105-
frame = DataFrame(np.arange(12).reshape((4, 3)), index=index,
106-
columns=columns)
107-
108-
result = frame.iloc[:, 1]
109-
exp = frame.loc[:, ('Ohio', 'Red')]
110-
assert isinstance(result, Series)
111-
tm.assert_series_equal(result, exp)
112-
113-
def test_iloc_mi(self):
114-
# GH 13797
115-
# Test if iloc can handle integer locations in MultiIndexed DataFrame
116-
117-
data = [['str00', 'str01'], ['str10', 'str11'], ['str20', 'srt21'],
118-
['str30', 'str31'], ['str40', 'str41']]
119-
120-
mi = MultiIndex.from_tuples(
121-
[('CC', 'A'), ('CC', 'B'), ('CC', 'B'), ('BB', 'a'), ('BB', 'b')])
122-
123-
expected = DataFrame(data)
124-
df_mi = DataFrame(data, index=mi)
125-
126-
result = DataFrame([[df_mi.iloc[r, c] for c in range(2)]
127-
for r in range(5)])
128-
129-
tm.assert_frame_equal(result, expected)
8+
@pytest.fixture
9+
def simple_multiindex_dataframe():
10+
"""
11+
Factory function to create simple 3 x 3 dataframe with
12+
both columns and row MultiIndex using supplied data or
13+
random data by default.
14+
"""
15+
def _simple_multiindex_dataframe(data=None):
16+
if data is None:
17+
data = np.random.randn(3, 3)
18+
return DataFrame(data, columns=[[2, 2, 4], [6, 8, 10]],
19+
index=[[4, 4, 8], [8, 10, 12]])
20+
return _simple_multiindex_dataframe
21+
22+
23+
@pytest.mark.parametrize('indexer, expected', [
24+
(lambda df: df.iloc[0],
25+
lambda arr: Series(arr[0], index=[[2, 2, 4], [6, 8, 10]], name=(4, 8))),
26+
(lambda df: df.iloc[2],
27+
lambda arr: Series(arr[2], index=[[2, 2, 4], [6, 8, 10]], name=(8, 12))),
28+
(lambda df: df.iloc[:, 2],
29+
lambda arr: Series(
30+
arr[:, 2], index=[[4, 4, 8], [8, 10, 12]], name=(4, 10)))
31+
])
32+
def test_iloc_returns_series(indexer, expected, simple_multiindex_dataframe):
33+
arr = np.random.randn(3, 3)
34+
df = simple_multiindex_dataframe(arr)
35+
result = indexer(df)
36+
expected = expected(arr)
37+
tm.assert_series_equal(result, expected)
38+
39+
40+
def test_iloc_returns_dataframe(simple_multiindex_dataframe):
41+
df = simple_multiindex_dataframe()
42+
result = df.iloc[[0, 1]]
43+
expected = df.xs(4, drop_level=False)
44+
tm.assert_frame_equal(result, expected)
45+
46+
47+
def test_iloc_returns_scalar(simple_multiindex_dataframe):
48+
arr = np.random.randn(3, 3)
49+
df = simple_multiindex_dataframe(arr)
50+
result = df.iloc[2, 2]
51+
expected = arr[2, 2]
52+
assert result == expected
53+
54+
55+
def test_iloc_getitem_multiple_items():
56+
# GH 5528
57+
tup = zip(*[['a', 'a', 'b', 'b'], ['x', 'y', 'x', 'y']])
58+
index = MultiIndex.from_tuples(tup)
59+
df = DataFrame(np.random.randn(4, 4), index=index)
60+
result = df.iloc[[2, 3]]
61+
expected = df.xs('b', drop_level=False)
62+
tm.assert_frame_equal(result, expected)
63+
64+
65+
def test_iloc_getitem_labels():
66+
# this is basically regular indexing
67+
arr = np.random.randn(4, 3)
68+
df = DataFrame(arr,
69+
columns=[['i', 'i', 'j'], ['A', 'A', 'B']],
70+
index=[['i', 'i', 'j', 'k'], ['X', 'X', 'Y', 'Y']])
71+
result = df.iloc[2, 2]
72+
expected = arr[2, 2]
73+
assert result == expected
74+
75+
76+
def test_frame_getitem_slice(multiindex_dataframe_random_data):
77+
df = multiindex_dataframe_random_data
78+
result = df.iloc[:4]
79+
expected = df[:4]
80+
tm.assert_frame_equal(result, expected)
81+
82+
83+
def test_frame_setitem_slice(multiindex_dataframe_random_data):
84+
df = multiindex_dataframe_random_data
85+
df.iloc[:4] = 0
86+
87+
assert (df.values[:4] == 0).all()
88+
assert (df.values[4:] != 0).all()
89+
90+
91+
def test_indexing_ambiguity_bug_1678():
92+
# GH 1678
93+
columns = MultiIndex.from_tuples(
94+
[('Ohio', 'Green'), ('Ohio', 'Red'), ('Colorado', 'Green')])
95+
index = MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1), ('b', 2)])
96+
97+
df = DataFrame(np.arange(12).reshape((4, 3)), index=index, columns=columns)
98+
99+
result = df.iloc[:, 1]
100+
expected = df.loc[:, ('Ohio', 'Red')]
101+
tm.assert_series_equal(result, expected)
102+
103+
104+
def test_iloc_integer_locations():
105+
# GH 13797
106+
data = [['str00', 'str01'], ['str10', 'str11'], ['str20', 'srt21'],
107+
['str30', 'str31'], ['str40', 'str41']]
108+
109+
index = MultiIndex.from_tuples(
110+
[('CC', 'A'), ('CC', 'B'), ('CC', 'B'), ('BB', 'a'), ('BB', 'b')])
111+
112+
expected = DataFrame(data)
113+
df = DataFrame(data, index=index)
114+
115+
result = DataFrame([[df.iloc[r, c] for c in range(2)] for r in range(5)])
116+
117+
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)