@@ -4135,13 +4135,22 @@ def _join_level(
41354135 """
41364136 from pandas .core .indexes .multi import MultiIndex
41374137
4138- def _get_leaf_sorter (labels ) :
4138+ def _get_leaf_sorter (labels : List [ np . ndarray ]) -> np . ndarray :
41394139 """
41404140 Returns sorter for the inner most level while preserving the
41414141 order of higher levels.
4142+
4143+ Parameters
4144+ ----------
4145+ labels : list[np.ndarray]
4146+ Each ndarray has signed integer dtype, not necessarily identical.
4147+
4148+ Returns
4149+ -------
4150+ np.ndarray[np.intp]
41424151 """
41434152 if labels [0 ].size == 0 :
4144- return np .empty (0 , dtype = "int64" )
4153+ return np .empty (0 , dtype = np . intp )
41454154
41464155 if len (labels ) == 1 :
41474156 return get_group_index_sorter (labels [0 ])
@@ -4154,7 +4163,7 @@ def _get_leaf_sorter(labels):
41544163
41554164 starts = np .hstack (([True ], tic , [True ])).nonzero ()[0 ]
41564165 lab = ensure_int64 (labels [- 1 ])
4157- return lib .get_level_sorter (lab , ensure_int64 (starts ))
4166+ return lib .get_level_sorter (lab , ensure_platform_int (starts ))
41584167
41594168 if isinstance (self , MultiIndex ) and isinstance (other , MultiIndex ):
41604169 raise TypeError ("Join on level between two MultiIndex objects is ambiguous" )
@@ -4189,12 +4198,12 @@ def _get_leaf_sorter(labels):
41894198 join_index = left [left_indexer ]
41904199
41914200 else :
4192- left_lev_indexer = ensure_int64 (left_lev_indexer )
4201+ left_lev_indexer = ensure_platform_int (left_lev_indexer )
41934202 rev_indexer = lib .get_reverse_indexer (left_lev_indexer , len (old_level ))
41944203 old_codes = left .codes [level ]
4195- new_lev_codes = algos . take_nd (
4196- rev_indexer , old_codes [old_codes != - 1 ], allow_fill = False
4197- )
4204+
4205+ taker = old_codes [old_codes != - 1 ]
4206+ new_lev_codes = rev_indexer . take ( taker )
41984207
41994208 new_codes = list (left .codes )
42004209 new_codes [level ] = new_lev_codes
@@ -4204,6 +4213,7 @@ def _get_leaf_sorter(labels):
42044213
42054214 if keep_order : # just drop missing values. o.w. keep order
42064215 left_indexer = np .arange (len (left ), dtype = np .intp )
4216+ left_indexer = cast (np .ndarray , left_indexer )
42074217 mask = new_lev_codes != - 1
42084218 if not mask .all ():
42094219 new_codes = [lab [mask ] for lab in new_codes ]
@@ -4213,11 +4223,12 @@ def _get_leaf_sorter(labels):
42134223 if level == 0 : # outer most level, take the fast route
42144224 ngroups = 1 + new_lev_codes .max ()
42154225 left_indexer , counts = libalgos .groupsort_indexer (
4216- new_lev_codes , ngroups
4226+ ensure_int64 ( new_lev_codes ) , ngroups
42174227 )
42184228
42194229 # missing values are placed first; drop them!
4220- left_indexer = left_indexer [counts [0 ] :]
4230+ # error: Value of type "Optional[ndarray]" is not indexable
4231+ left_indexer = left_indexer [counts [0 ] :] # type: ignore[index]
42214232 new_codes = [lab [left_indexer ] for lab in new_codes ]
42224233
42234234 else : # sort the leaves
0 commit comments