@@ -293,21 +293,27 @@ def _reindex(keys, level=None):
293
293
inds , = np .asarray (key , dtype = bool ).nonzero ()
294
294
return self .obj .take (inds , axis = axis )
295
295
else :
296
- if isinstance (key , Index ):
296
+ was_index = isinstance (key , Index )
297
+ if was_index :
297
298
# want Index objects to pass through untouched
298
299
keyarr = key
299
300
else :
300
301
# asarray can be unsafe, NumPy strings are weird
301
302
keyarr = _asarray_tuplesafe (key )
302
303
303
304
if _is_integer_dtype (keyarr ):
305
+ if labels .inferred_type != 'integer' :
306
+ keyarr = np .where (keyarr < 0 ,
307
+ len (labels ) + keyarr , keyarr )
308
+
304
309
if labels .inferred_type == 'mixed-integer' :
305
310
indexer = labels .get_indexer (keyarr )
306
311
if (indexer >= 0 ).all ():
307
312
self .obj .take (indexer , axis = axis )
308
313
else :
309
314
return self .obj .take (keyarr , axis = axis )
310
315
elif not labels .inferred_type == 'integer' :
316
+
311
317
return self .obj .take (keyarr , axis = axis )
312
318
313
319
# this is not the most robust, but...
@@ -406,6 +412,9 @@ def _convert_to_indexer(self, obj, axis=0):
406
412
407
413
# If have integer labels, defer to label-based indexing
408
414
if _is_integer_dtype (objarr ) and not is_int_index :
415
+ if labels .inferred_type != 'integer' :
416
+ objarr = np .where (objarr < 0 ,
417
+ len (labels ) + objarr , objarr )
409
418
return objarr
410
419
411
420
# this is not the most robust, but...
0 commit comments