Skip to content

Commit d965a6a

Browse files
jbrockmendelroberthdevries
authored andcommitted
REF: collect+parametrize reorder_levels tests (pandas-dev#32373)
1 parent 277a22f commit d965a6a

File tree

6 files changed

+87
-98
lines changed

6 files changed

+87
-98
lines changed

pandas/conftest.py

+14
Original file line numberDiff line numberDiff line change
@@ -1057,3 +1057,17 @@ def index_or_series_obj(request):
10571057
copy to avoid mutation, e.g. setting .name
10581058
"""
10591059
return _index_or_series_objs[request.param].copy(deep=True)
1060+
1061+
1062+
@pytest.fixture
1063+
def multiindex_year_month_day_dataframe_random_data():
1064+
"""
1065+
DataFrame with 3 level MultiIndex (year, month, day) covering
1066+
first 100 business days from 2000-01-01 with random data
1067+
"""
1068+
tdf = tm.makeTimeDataFrame(100)
1069+
ymd = tdf.groupby([lambda x: x.year, lambda x: x.month, lambda x: x.day]).sum()
1070+
# use Int64Index, to make sure things work
1071+
ymd.index.set_levels([lev.astype("i8") for lev in ymd.index.levels], inplace=True)
1072+
ymd.index.set_names(["year", "month", "day"], inplace=True)
1073+
return ymd

pandas/tests/frame/test_alter_axes.py

-38
Original file line numberDiff line numberDiff line change
@@ -689,44 +689,6 @@ def test_rename_axis_mapper(self):
689689
with pytest.raises(TypeError, match="bogus"):
690690
df.rename_axis(bogus=None)
691691

692-
def test_reorder_levels(self):
693-
index = MultiIndex(
694-
levels=[["bar"], ["one", "two", "three"], [0, 1]],
695-
codes=[[0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 1, 2], [0, 1, 0, 1, 0, 1]],
696-
names=["L0", "L1", "L2"],
697-
)
698-
df = DataFrame({"A": np.arange(6), "B": np.arange(6)}, index=index)
699-
700-
# no change, position
701-
result = df.reorder_levels([0, 1, 2])
702-
tm.assert_frame_equal(df, result)
703-
704-
# no change, labels
705-
result = df.reorder_levels(["L0", "L1", "L2"])
706-
tm.assert_frame_equal(df, result)
707-
708-
# rotate, position
709-
result = df.reorder_levels([1, 2, 0])
710-
e_idx = MultiIndex(
711-
levels=[["one", "two", "three"], [0, 1], ["bar"]],
712-
codes=[[0, 1, 2, 0, 1, 2], [0, 1, 0, 1, 0, 1], [0, 0, 0, 0, 0, 0]],
713-
names=["L1", "L2", "L0"],
714-
)
715-
expected = DataFrame({"A": np.arange(6), "B": np.arange(6)}, index=e_idx)
716-
tm.assert_frame_equal(result, expected)
717-
718-
result = df.reorder_levels([0, 0, 0])
719-
e_idx = MultiIndex(
720-
levels=[["bar"], ["bar"], ["bar"]],
721-
codes=[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]],
722-
names=["L0", "L0", "L0"],
723-
)
724-
expected = DataFrame({"A": np.arange(6), "B": np.arange(6)}, index=e_idx)
725-
tm.assert_frame_equal(result, expected)
726-
727-
result = df.reorder_levels(["L0", "L0", "L0"])
728-
tm.assert_frame_equal(result, expected)
729-
730692
def test_set_index_names(self):
731693
df = tm.makeDataFrame()
732694
df.index.name = "name"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import numpy as np
2+
import pytest
3+
4+
from pandas import DataFrame, MultiIndex, Series
5+
import pandas._testing as tm
6+
7+
8+
class TestReorderLevels:
9+
@pytest.mark.parametrize("klass", [Series, DataFrame])
10+
def test_reorder_levels(self, klass):
11+
index = MultiIndex(
12+
levels=[["bar"], ["one", "two", "three"], [0, 1]],
13+
codes=[[0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 1, 2], [0, 1, 0, 1, 0, 1]],
14+
names=["L0", "L1", "L2"],
15+
)
16+
df = DataFrame({"A": np.arange(6), "B": np.arange(6)}, index=index)
17+
obj = df if klass is DataFrame else df["A"]
18+
19+
# no change, position
20+
result = obj.reorder_levels([0, 1, 2])
21+
tm.assert_equal(obj, result)
22+
23+
# no change, labels
24+
result = obj.reorder_levels(["L0", "L1", "L2"])
25+
tm.assert_equal(obj, result)
26+
27+
# rotate, position
28+
result = obj.reorder_levels([1, 2, 0])
29+
e_idx = MultiIndex(
30+
levels=[["one", "two", "three"], [0, 1], ["bar"]],
31+
codes=[[0, 1, 2, 0, 1, 2], [0, 1, 0, 1, 0, 1], [0, 0, 0, 0, 0, 0]],
32+
names=["L1", "L2", "L0"],
33+
)
34+
expected = DataFrame({"A": np.arange(6), "B": np.arange(6)}, index=e_idx)
35+
expected = expected if klass is DataFrame else expected["A"]
36+
tm.assert_equal(result, expected)
37+
38+
result = obj.reorder_levels([0, 0, 0])
39+
e_idx = MultiIndex(
40+
levels=[["bar"], ["bar"], ["bar"]],
41+
codes=[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]],
42+
names=["L0", "L0", "L0"],
43+
)
44+
expected = DataFrame({"A": np.arange(6), "B": np.arange(6)}, index=e_idx)
45+
expected = expected if klass is DataFrame else expected["A"]
46+
tm.assert_equal(result, expected)
47+
48+
result = obj.reorder_levels(["L0", "L0", "L0"])
49+
tm.assert_equal(result, expected)
50+
51+
def test_reorder_levels_swaplevel_equivalence(
52+
self, multiindex_year_month_day_dataframe_random_data
53+
):
54+
55+
ymd = multiindex_year_month_day_dataframe_random_data
56+
57+
result = ymd.reorder_levels(["month", "day", "year"])
58+
expected = ymd.swaplevel(0, 1).swaplevel(1, 2)
59+
tm.assert_frame_equal(result, expected)
60+
61+
result = ymd["A"].reorder_levels(["month", "day", "year"])
62+
expected = ymd["A"].swaplevel(0, 1).swaplevel(1, 2)
63+
tm.assert_series_equal(result, expected)
64+
65+
result = ymd.T.reorder_levels(["month", "day", "year"], axis=1)
66+
expected = ymd.T.swaplevel(0, 1, axis=1).swaplevel(1, 2, axis=1)
67+
tm.assert_frame_equal(result, expected)
68+
69+
with pytest.raises(TypeError, match="hierarchical axis"):
70+
ymd.reorder_levels([1, 2], axis=1)
71+
72+
with pytest.raises(IndexError, match="Too many levels"):
73+
ymd.index.reorder_levels([1, 2, 3])

pandas/tests/indexing/multiindex/conftest.py

-15
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import pytest
33

44
from pandas import DataFrame, Index, MultiIndex
5-
import pandas._testing as tm
65

76

87
@pytest.fixture
@@ -16,17 +15,3 @@ def multiindex_dataframe_random_data():
1615
return DataFrame(
1716
np.random.randn(10, 3), index=index, columns=Index(["A", "B", "C"], name="exp")
1817
)
19-
20-
21-
@pytest.fixture
22-
def multiindex_year_month_day_dataframe_random_data():
23-
"""
24-
DataFrame with 3 level MultiIndex (year, month, day) covering
25-
first 100 business days from 2000-01-01 with random data
26-
"""
27-
tdf = tm.makeTimeDataFrame(100)
28-
ymd = tdf.groupby([lambda x: x.year, lambda x: x.month, lambda x: x.day]).sum()
29-
# use Int64Index, to make sure things work
30-
ymd.index.set_levels([lev.astype("i8") for lev in ymd.index.levels], inplace=True)
31-
ymd.index.set_names(["year", "month", "day"], inplace=True)
32-
return ymd

pandas/tests/series/test_alter_axes.py

-26
Original file line numberDiff line numberDiff line change
@@ -54,32 +54,6 @@ def test_set_index_makes_timeseries(self):
5454
s.index = idx
5555
assert s.index.is_all_dates
5656

57-
def test_reorder_levels(self):
58-
index = MultiIndex(
59-
levels=[["bar"], ["one", "two", "three"], [0, 1]],
60-
codes=[[0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 1, 2], [0, 1, 0, 1, 0, 1]],
61-
names=["L0", "L1", "L2"],
62-
)
63-
s = Series(np.arange(6), index=index)
64-
65-
# no change, position
66-
result = s.reorder_levels([0, 1, 2])
67-
tm.assert_series_equal(s, result)
68-
69-
# no change, labels
70-
result = s.reorder_levels(["L0", "L1", "L2"])
71-
tm.assert_series_equal(s, result)
72-
73-
# rotate, position
74-
result = s.reorder_levels([1, 2, 0])
75-
e_idx = MultiIndex(
76-
levels=[["one", "two", "three"], [0, 1], ["bar"]],
77-
codes=[[0, 1, 2, 0, 1, 2], [0, 1, 0, 1, 0, 1], [0, 0, 0, 0, 0, 0]],
78-
names=["L1", "L2", "L0"],
79-
)
80-
expected = Series(np.arange(6), index=e_idx)
81-
tm.assert_series_equal(result, expected)
82-
8357
def test_rename_axis_mapper(self):
8458
# GH 19978
8559
mi = MultiIndex.from_product([["a", "b", "c"], [1, 2]], names=["ll", "nn"])

pandas/tests/test_multilevel.py

-19
Original file line numberDiff line numberDiff line change
@@ -939,25 +939,6 @@ def test_swaplevel(self):
939939
with pytest.raises(TypeError, match=msg):
940940
DataFrame(range(3)).swaplevel()
941941

942-
def test_reorder_levels(self):
943-
result = self.ymd.reorder_levels(["month", "day", "year"])
944-
expected = self.ymd.swaplevel(0, 1).swaplevel(1, 2)
945-
tm.assert_frame_equal(result, expected)
946-
947-
result = self.ymd["A"].reorder_levels(["month", "day", "year"])
948-
expected = self.ymd["A"].swaplevel(0, 1).swaplevel(1, 2)
949-
tm.assert_series_equal(result, expected)
950-
951-
result = self.ymd.T.reorder_levels(["month", "day", "year"], axis=1)
952-
expected = self.ymd.T.swaplevel(0, 1, axis=1).swaplevel(1, 2, axis=1)
953-
tm.assert_frame_equal(result, expected)
954-
955-
with pytest.raises(TypeError, match="hierarchical axis"):
956-
self.ymd.reorder_levels([1, 2], axis=1)
957-
958-
with pytest.raises(IndexError, match="Too many levels"):
959-
self.ymd.index.reorder_levels([1, 2, 3])
960-
961942
def test_insert_index(self):
962943
df = self.ymd[:5].T
963944
df[2000, 1, 10] = df[2000, 1, 7]

0 commit comments

Comments
 (0)