Skip to content

Commit ec6e096

Browse files
committed
TST: Add regression test for MultiIndex merge after reset_index
- Add test for GH#62150 - Bug was present in 2.3.1, fixed in 3.0.0 - Test ensures merge works when one df has single-level index and other has multi-level index after reset_index() Closes #62150
1 parent 1a3230d commit ec6e096

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

pandas/tests/reshape/merge/test_merge.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2936,6 +2936,44 @@ def test_merge_multiindex_single_level():
29362936
tm.assert_frame_equal(result, expected)
29372937

29382938

2939+
def test_merge_multiindex_reset_index_mixed():
2940+
# GH#62150 - merging reset MultiIndex when one df has single-level index
2941+
# Bug existed in 2.3.1, fixed in 3.0.0, this test prevents regression
2942+
2943+
# Create first dataframe with MultiIndex on both index and columns
2944+
df = DataFrame(data={("column_1", ""): [1, 1], ("column_2", ""): [2, 2]})
2945+
df.index = MultiIndex.from_arrays(
2946+
[[1, 1], ["metadata_1", "metadata_2"]], names=["index", "metadata"]
2947+
)
2948+
2949+
# Create second dataframe with single index and MultiIndex columns
2950+
df2 = DataFrame(data=[1, 1], index=[1, 1]).rename_axis("index", axis=0)
2951+
df2.columns = MultiIndex.from_product([["new_data"], [""]])
2952+
2953+
# Test merge with on='index' - should work
2954+
# Note: PerformanceWarning is expected due to non-lexsorted MultiIndex
2955+
with tm.assert_produces_warning(pd.errors.PerformanceWarning):
2956+
result = df.reset_index().merge(df2.reset_index(), on="index")
2957+
2958+
expected = DataFrame(
2959+
{
2960+
("index", ""): [1, 1, 1, 1],
2961+
("metadata", ""): ["metadata_1", "metadata_1", "metadata_2", "metadata_2"],
2962+
("column_1", ""): [1, 1, 1, 1],
2963+
("column_2", ""): [2, 2, 2, 2],
2964+
("new_data", ""): [1, 1, 1, 1],
2965+
}
2966+
)
2967+
expected.columns = MultiIndex.from_tuples(expected.columns)
2968+
2969+
tm.assert_frame_equal(result, expected)
2970+
2971+
# Test merge with on=[('index', '')] - should also work
2972+
# Warning may or may not be raised depending on internal state
2973+
result2 = df.reset_index().merge(df2.reset_index(), on=[("index", "")])
2974+
tm.assert_frame_equal(result2, expected)
2975+
2976+
29392977
@pytest.mark.parametrize("on_index", [True, False])
29402978
@pytest.mark.parametrize("left_unique", [True, False])
29412979
@pytest.mark.parametrize("left_monotonic", [True, False])

0 commit comments

Comments
 (0)