@@ -1292,12 +1292,9 @@ def _get_join_indexers(
1292
1292
right_keys
1293
1293
), "left_key and right_keys must be the same length"
1294
1294
1295
- # bind `sort` arg. of _factorize_keys
1296
- fkeys = partial (_factorize_keys , sort = sort )
1297
-
1298
1295
# get left & right join labels and num. of levels at each location
1299
1296
mapped = (
1300
- _factorize_keys (left_keys [n ], right_keys [n ], sort = sort )
1297
+ _factorize_keys (left_keys [n ], right_keys [n ], sort = sort , how = how )
1301
1298
for n in range (len (left_keys ))
1302
1299
)
1303
1300
zipped = zip (* mapped )
@@ -1310,19 +1307,14 @@ def _get_join_indexers(
1310
1307
# `count` is the num. of unique keys
1311
1308
# set(lkey) | set(rkey) == range(count)
1312
1309
1313
- # flip left and right keys if performing a right merge
1314
- # to preserve right merge row order (GH 27453)
1315
- if how == "right" :
1316
- factorized_rkey , factorized_lkey , count = fkeys (rkey , lkey )
1317
- else :
1318
- factorized_lkey , factorized_rkey , count = fkeys (lkey , rkey )
1310
+ lkey , rkey , count = _factorize_keys (lkey , rkey , sort = sort , how = how )
1319
1311
# preserve left frame order if how == 'left' and sort == False
1320
1312
kwargs = copy .copy (kwargs )
1321
1313
if how == "left" :
1322
1314
kwargs ["sort" ] = sort
1323
1315
join_func = _join_functions [how ]
1324
1316
1325
- return join_func (factorized_lkey , factorized_rkey , count , ** kwargs )
1317
+ return join_func (lkey , rkey , count , ** kwargs )
1326
1318
1327
1319
1328
1320
def _restore_dropped_levels_multijoin (
@@ -1858,7 +1850,7 @@ def _right_outer_join(x, y, max_groups):
1858
1850
}
1859
1851
1860
1852
1861
- def _factorize_keys (lk , rk , sort = True ):
1853
+ def _factorize_keys (lk , rk , sort = True , how = "inner" ):
1862
1854
# Some pre-processing for non-ndarray lk / rk
1863
1855
if is_datetime64tz_dtype (lk ) and is_datetime64tz_dtype (rk ):
1864
1856
lk = getattr (lk , "_values" , lk )._data
@@ -1927,6 +1919,8 @@ def _factorize_keys(lk, rk, sort=True):
1927
1919
np .putmask (rlab , rmask , count )
1928
1920
count += 1
1929
1921
1922
+ if how == "right" :
1923
+ return rlab , llab , count
1930
1924
return llab , rlab , count
1931
1925
1932
1926
0 commit comments