diff --git a/pandas/core/reshape/merge.py b/pandas/core/reshape/merge.py index c301d6e7c7155..d532306bc01ab 100644 --- a/pandas/core/reshape/merge.py +++ b/pandas/core/reshape/merge.py @@ -606,10 +606,19 @@ def __init__( f"right_index parameter must be of type bool, not {type(right_index)}" ) - # warn user when merging between different levels + # warn users when merging between different index levels + if _left.index.nlevels != _right.index.nlevels: + msg = ( + "merging between different index levels can give an unintended " + f"result ({left.index.nlevels} levels on the left," + f"{right.index.nlevels} on the right)" + ) + warnings.warn(msg, UserWarning) + + # warn user when merging between different column levels if _left.columns.nlevels != _right.columns.nlevels: msg = ( - "merging between different levels can give an unintended " + "merging between different column levels can give an unintended " f"result ({left.columns.nlevels} levels on the left," f"{right.columns.nlevels} on the right)" ) diff --git a/pandas/tests/frame/test_axis_select_reindex.py b/pandas/tests/frame/test_axis_select_reindex.py index 7effa98fd8213..c6ea895191cbf 100644 --- a/pandas/tests/frame/test_axis_select_reindex.py +++ b/pandas/tests/frame/test_axis_select_reindex.py @@ -182,6 +182,32 @@ def test_drop_api_equivalence(self): with pytest.raises(ValueError): df.drop(axis=1) + def test_merge_join_different_index_levels(self): + #GH 13094 + + df1 = DataFrame([[2, 3], [5, 7]], columns=['a', 'p']).set_index('a') + + df2 = DataFrame([[1, 2, 3], [3, 4, 8], [5, 6, 9]], + columns=['a', 'b', 'c']).set_index(['a', 'b']) + + # join + columns = ['a', 'b', 'p', 'c'] + expected = DataFrame([[5, 6, 7, 9]], columns=columns).set_index(['a', 'b']) + + with tm.assert_produces_warning(UserWarning): + result = df1.join(df2, how='left') + + tm.assert_frame_equal(result, expected) + + # merge + columns = ['a', 'p', 'c'] + expected = DataFrame([[5, 7, 9]], columns=columns).set_index('a') + + with tm.assert_produces_warning(UserWarning): + result = pd.merge(df1, df2, on='a') + + tm.assert_frame_equal(result, expected) + def test_merge_join_different_levels(self): # GH 9455