@@ -4135,13 +4135,22 @@ def _join_level(
4135
4135
"""
4136
4136
from pandas .core .indexes .multi import MultiIndex
4137
4137
4138
- def _get_leaf_sorter (labels ) :
4138
+ def _get_leaf_sorter (labels : List [ np . ndarray ]) -> np . ndarray :
4139
4139
"""
4140
4140
Returns sorter for the inner most level while preserving the
4141
4141
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]
4142
4151
"""
4143
4152
if labels [0 ].size == 0 :
4144
- return np .empty (0 , dtype = "int64" )
4153
+ return np .empty (0 , dtype = np . intp )
4145
4154
4146
4155
if len (labels ) == 1 :
4147
4156
return get_group_index_sorter (labels [0 ])
@@ -4154,7 +4163,7 @@ def _get_leaf_sorter(labels):
4154
4163
4155
4164
starts = np .hstack (([True ], tic , [True ])).nonzero ()[0 ]
4156
4165
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 ))
4158
4167
4159
4168
if isinstance (self , MultiIndex ) and isinstance (other , MultiIndex ):
4160
4169
raise TypeError ("Join on level between two MultiIndex objects is ambiguous" )
@@ -4189,12 +4198,12 @@ def _get_leaf_sorter(labels):
4189
4198
join_index = left [left_indexer ]
4190
4199
4191
4200
else :
4192
- left_lev_indexer = ensure_int64 (left_lev_indexer )
4201
+ left_lev_indexer = ensure_platform_int (left_lev_indexer )
4193
4202
rev_indexer = lib .get_reverse_indexer (left_lev_indexer , len (old_level ))
4194
4203
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 )
4198
4207
4199
4208
new_codes = list (left .codes )
4200
4209
new_codes [level ] = new_lev_codes
@@ -4204,6 +4213,7 @@ def _get_leaf_sorter(labels):
4204
4213
4205
4214
if keep_order : # just drop missing values. o.w. keep order
4206
4215
left_indexer = np .arange (len (left ), dtype = np .intp )
4216
+ left_indexer = cast (np .ndarray , left_indexer )
4207
4217
mask = new_lev_codes != - 1
4208
4218
if not mask .all ():
4209
4219
new_codes = [lab [mask ] for lab in new_codes ]
@@ -4213,11 +4223,12 @@ def _get_leaf_sorter(labels):
4213
4223
if level == 0 : # outer most level, take the fast route
4214
4224
ngroups = 1 + new_lev_codes .max ()
4215
4225
left_indexer , counts = libalgos .groupsort_indexer (
4216
- new_lev_codes , ngroups
4226
+ ensure_int64 ( new_lev_codes ) , ngroups
4217
4227
)
4218
4228
4219
4229
# 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]
4221
4232
new_codes = [lab [left_indexer ] for lab in new_codes ]
4222
4233
4223
4234
else : # sort the leaves
0 commit comments