|
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