Skip to content

Commit 7a9e0fe

Browse files
committed
BUG: created check and warning for merging dataframes on unequal index levels (pandas-dev#13094)
1 parent bdb4a08 commit 7a9e0fe

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

pandas/core/reshape/merge.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -606,10 +606,19 @@ def __init__(
606606
f"right_index parameter must be of type bool, not {type(right_index)}"
607607
)
608608

609-
# warn user when merging between different levels
609+
# warn users when merging between different index levels
610+
if _left.index.nlevels != _right.index.nlevels:
611+
msg = (
612+
"merging between different index levels can give an unintended "
613+
f"result ({left.index.nlevels} levels on the left,"
614+
f"{right.index.nlevels} on the right)"
615+
)
616+
warnings.warn(msg, UserWarning)
617+
618+
# warn user when merging between different column levels
610619
if _left.columns.nlevels != _right.columns.nlevels:
611620
msg = (
612-
"merging between different levels can give an unintended "
621+
"merging between different column levels can give an unintended "
613622
f"result ({left.columns.nlevels} levels on the left,"
614623
f"{right.columns.nlevels} on the right)"
615624
)

pandas/tests/frame/test_axis_select_reindex.py

+26
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,32 @@ def test_drop_api_equivalence(self):
182182
with pytest.raises(ValueError):
183183
df.drop(axis=1)
184184

185+
def test_merge_join_different_index_levels(self):
186+
#GH 13094
187+
188+
df1 = DataFrame([[2, 3], [5, 7]], columns=['a', 'p']).set_index('a')
189+
190+
df2 = DataFrame([[1, 2, 3], [3, 4, 8], [5, 6, 9]],
191+
columns=['a', 'b', 'c']).set_index(['a', 'b'])
192+
193+
# join
194+
columns = ['a', 'b', 'p', 'c']
195+
expected = DataFrame([[5, 6, 7, 9]], columns=columns).set_index(['a', 'b'])
196+
197+
with tm.assert_produces_warning(UserWarning):
198+
result = df1.join(df2, how='left')
199+
200+
tm.assert_frame_equal(result, expected)
201+
202+
# merge
203+
columns = ['a', 'p', 'c']
204+
expected = DataFrame([[5, 7, 9]], columns=columns).set_index('a')
205+
206+
with tm.assert_produces_warning(UserWarning):
207+
result = pd.merge(df1, df2, on='a')
208+
209+
tm.assert_frame_equal(result, expected)
210+
185211
def test_merge_join_different_levels(self):
186212
# GH 9455
187213

0 commit comments

Comments
 (0)