Skip to content

Commit db15036

Browse files
committed
TST: Add test for issue pandas-dev#28518
* test_lexsort_depth verify that lexsort_depth return the correct depth when sortorder is passed to the MultiIndex constructor * test_raise_invalid_sortorder test that the MultiIndex constructor raise when passing an incorrect sortorder * test_merge_multiindex_columns test the original issue
1 parent 02675e3 commit db15036

File tree

3 files changed

+77
-1
lines changed

3 files changed

+77
-1
lines changed

pandas/tests/indexes/multi/test_indexing.py

-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ def test_slice_locs_not_contained():
9696
index = MultiIndex(
9797
levels=[[0, 2, 4, 6], [0, 2, 4]],
9898
codes=[[0, 0, 0, 1, 1, 2, 3, 3, 3], [0, 1, 2, 1, 2, 2, 0, 1, 2]],
99-
sortorder=0,
10099
)
101100

102101
result = index.slice_locs((1, 0), (5, 2))

pandas/tests/reshape/merge/test_merge.py

+29
Original file line numberDiff line numberDiff line change
@@ -2094,3 +2094,32 @@ def test_merge_equal_cat_dtypes2():
20942094

20952095
# Categorical is unordered, so don't check ordering.
20962096
tm.assert_frame_equal(result, expected, check_categorical=False)
2097+
2098+
def test_merge_multiindex_columns():
2099+
# Issue #28518
2100+
# Verify that merging two dataframes give the expected labels
2101+
# The original cause of this issue come from a bug lexsort_depth and is tested in
2102+
# test_lexsort_depth
2103+
2104+
index_tuples=[]
2105+
letters = ["a", "b", "c", "d"]
2106+
numbers = ["1", "2", "3"]
2107+
2108+
for l in letters:
2109+
for n in numbers:
2110+
index_tuples.append([l, n])
2111+
2112+
index = pd.MultiIndex.from_tuples(index_tuples, names=["outer", "inner"])
2113+
2114+
frame_x = pd.DataFrame(columns = index)
2115+
frame_x["id"]=""
2116+
2117+
frame_y = pd.DataFrame(columns = index)
2118+
frame_y["id"]=""
2119+
2120+
l_suf = '_x'
2121+
r_suf = '_y'
2122+
expected_labels = sum(([l + l_suf, l + r_suf] for l in letters), [])
2123+
merged_frame = frame_x.merge(frame_y, on="id", suffixes=((l_suf, r_suf))).columns
2124+
for label in expected_labels:
2125+
assert label in merged_frame

pandas/tests/test_multilevel.py

+48
Original file line numberDiff line numberDiff line change
@@ -2056,6 +2056,54 @@ def test_is_lexsorted(self):
20562056
assert not index.is_lexsorted()
20572057
assert index.lexsort_depth == 0
20582058

2059+
def test_raise_invalid_sortorder(self):
2060+
# Test that the MultiIndex constructor raise when a incorrect sortorder is given
2061+
# Issue #28518
2062+
2063+
levels = [[0, 1], [0, 1, 2]]
2064+
2065+
# Correct sortorder
2066+
index = MultiIndex(
2067+
levels=levels, codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
2068+
sortorder=2,
2069+
)
2070+
2071+
with pytest.raises(ValueError, match=r".* sortorder 2 with lexsort_depth 1.*"):
2072+
index = MultiIndex(
2073+
levels=levels, codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 2, 1]],
2074+
sortorder=2,
2075+
)
2076+
2077+
with pytest.raises(ValueError, match=r".* sortorder 1 with lexsort_depth 0.*"):
2078+
index = MultiIndex(
2079+
levels=levels, codes=[[0, 0, 1, 0, 1, 1], [0, 1, 0, 2, 2, 1]],
2080+
sortorder=1,
2081+
)
2082+
2083+
def test_lexsort_depth(self):
2084+
# Test that lexsort_depth return the correct sortorder when it was given to the MultiIndex const.
2085+
# Issue #28518
2086+
2087+
levels = [[0, 1], [0, 1, 2]]
2088+
2089+
index = MultiIndex(
2090+
levels=levels, codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
2091+
sortorder=2,
2092+
)
2093+
assert index.lexsort_depth == 2
2094+
2095+
index = MultiIndex(
2096+
levels=levels, codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 2, 1]],
2097+
sortorder=1,
2098+
)
2099+
assert index.lexsort_depth == 1
2100+
2101+
index = MultiIndex(
2102+
levels=levels, codes=[[0, 0, 1, 0, 1, 1], [0, 1, 0, 2, 2, 1]],
2103+
sortorder=0,
2104+
)
2105+
assert index.lexsort_depth == 0
2106+
20592107
def test_sort_index_and_reconstruction(self):
20602108

20612109
# 15622

0 commit comments

Comments
 (0)