@@ -458,8 +458,23 @@ def _reindex(keys, level=None):
458458 if labels .is_unique :
459459 return _reindex (keyarr , level = level )
460460 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
463478
464479 def _convert_to_indexer (self , obj , axis = 0 ):
465480 """
@@ -569,20 +584,8 @@ def _convert_to_indexer(self, obj, axis=0):
569584
570585 # non-unique (dups)
571586 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
586589
587590 mask = check == - 1
588591 if mask .any ():
0 commit comments