@@ -458,8 +458,23 @@ def _reindex(keys, level=None):
458
458
if labels .is_unique :
459
459
return _reindex (keyarr , level = level )
460
460
else :
461
- mask = labels .isin (keyarr )
462
- return self .obj .take (mask .nonzero ()[0 ], axis = axis , convert = False )
461
+ indexer , missing = labels .get_indexer_non_unique (keyarr )
462
+ check = indexer != - 1
463
+ result = self .obj .take (indexer [check ], axis = axis , convert = False )
464
+
465
+ # need to merge the result labels and the missing labels
466
+ if len (missing ):
467
+ l = np .arange (len (indexer ))
468
+
469
+ missing_labels = keyarr .take (missing )
470
+ missing_labels_indexer = l [~ check ]
471
+ cur_labels = result ._get_axis (axis ).values
472
+ cur_labels_indexer = l [check ]
473
+ new_labels = lib .combine_from_indexers (cur_labels , cur_labels_indexer ,
474
+ missing_labels , missing_labels_indexer )
475
+ result = result .reindex_axis (new_labels ,axis = axis )
476
+
477
+ return result
463
478
464
479
def _convert_to_indexer (self , obj , axis = 0 ):
465
480
"""
@@ -569,20 +584,8 @@ def _convert_to_indexer(self, obj, axis=0):
569
584
570
585
# non-unique (dups)
571
586
else :
572
- indexer = []
573
- check = np .arange (len (labels ))
574
- lvalues = labels .values
575
- for x in objarr :
576
- # ugh
577
- to_or = lib .map_infer (lvalues , x .__eq__ )
578
- if not to_or .any ():
579
- raise KeyError ('%s not in index' % str (x ))
580
-
581
- # add the indicies (as we want to take)
582
- indexer .extend (check [to_or ])
583
-
584
- indexer = Index (indexer )
585
-
587
+ indexer , missing = labels .get_indexer_non_unique (objarr )
588
+ check = indexer
586
589
587
590
mask = check == - 1
588
591
if mask .any ():
0 commit comments