| 
1 | 1 | # -*- coding: utf-8 -*-  | 
2 | 2 | 
 
  | 
3 | 3 | import numpy as np  | 
4 |  | -from pandas import Index  | 
 | 4 | +from pandas import Index, DataFrame, Categorical, merge  | 
5 | 5 | 
 
  | 
6 | 6 | from pandas._libs import join as _join  | 
7 | 7 | import pandas.util.testing as tm  | 
8 |  | -from pandas.util.testing import assert_almost_equal  | 
 | 8 | +from pandas.util.testing import assert_almost_equal, assert_frame_equal  | 
9 | 9 | 
 
  | 
10 | 10 | 
 
  | 
11 | 11 | class TestIndexer(object):  | 
@@ -192,3 +192,43 @@ def test_inner_join_indexer2():  | 
192 | 192 | 
 
  | 
193 | 193 |     exp_ridx = np.array([0, 1, 2, 3], dtype=np.int64)  | 
194 | 194 |     assert_almost_equal(ridx, exp_ridx)  | 
 | 195 | + | 
 | 196 | + | 
 | 197 | +def test_merge_join_categorical_multiindex():  | 
 | 198 | +    # From issue 16627  | 
 | 199 | +    a = {'Cat1': Categorical(['a', 'b', 'a', 'c', 'a', 'b'],  | 
 | 200 | +                             ['a', 'b', 'c']),  | 
 | 201 | +         'Int1': [0, 1, 0, 1, 0, 0]}  | 
 | 202 | +    a = DataFrame(a)  | 
 | 203 | + | 
 | 204 | +    b = {'Cat': Categorical(['a', 'b', 'c', 'a', 'b', 'c'],  | 
 | 205 | +                            ['a', 'b', 'c']),  | 
 | 206 | +         'Int': [0, 0, 0, 1, 1, 1],  | 
 | 207 | +         'Factor': [1.1, 1.2, 1.3, 1.4, 1.5, 1.6]}  | 
 | 208 | +    b = DataFrame(b).set_index(['Cat', 'Int'])['Factor']  | 
 | 209 | + | 
 | 210 | +    expected = merge(a, b.reset_index(), left_on=['Cat1', 'Int1'],  | 
 | 211 | +                     right_on=['Cat', 'Int'], how='left')  | 
 | 212 | +    result = a.join(b, on=['Cat1', 'Int1'])  | 
 | 213 | +    expected = expected.drop(['Cat', 'Int'], axis=1)  | 
 | 214 | +    assert_frame_equal(expected, result)  | 
 | 215 | + | 
 | 216 | +    # Same test, but with ordered categorical  | 
 | 217 | +    a = {'Cat1': Categorical(['a', 'b', 'a', 'c', 'a', 'b'],  | 
 | 218 | +                             ['b', 'a', 'c'],  | 
 | 219 | +                             ordered=True),  | 
 | 220 | +         'Int1': [0, 1, 0, 1, 0, 0]}  | 
 | 221 | +    a = DataFrame(a)  | 
 | 222 | + | 
 | 223 | +    b = {'Cat': Categorical(['a', 'b', 'c', 'a', 'b', 'c'],  | 
 | 224 | +                            ['b', 'a', 'c'],  | 
 | 225 | +                            ordered=True),  | 
 | 226 | +         'Int': [0, 0, 0, 1, 1, 1],  | 
 | 227 | +         'Factor': [1.1, 1.2, 1.3, 1.4, 1.5, 1.6]}  | 
 | 228 | +    b = DataFrame(b).set_index(['Cat', 'Int'])['Factor']  | 
 | 229 | + | 
 | 230 | +    expected = merge(a, b.reset_index(), left_on=['Cat1', 'Int1'],  | 
 | 231 | +                     right_on=['Cat', 'Int'], how='left')  | 
 | 232 | +    result = a.join(b, on=['Cat1', 'Int1'])  | 
 | 233 | +    expected = expected.drop(['Cat', 'Int'], axis=1)  | 
 | 234 | +    assert_frame_equal(expected, result)  | 
0 commit comments