@@ -886,7 +886,7 @@ def _try_mi(k):
886
886
887
887
raise InvalidIndexError (key )
888
888
889
- def _get_level_values (self , level ):
889
+ def _get_level_values (self , level , unique = False ):
890
890
"""
891
891
Return vector of label values for requested level,
892
892
equal to the length of the index
@@ -896,17 +896,23 @@ def _get_level_values(self, level):
896
896
Parameters
897
897
----------
898
898
level : int level
899
+ unique : bool
900
+ if True, drop duplicated values
901
+
902
+ .. versionadded:: 0.21.0
899
903
900
904
Returns
901
905
-------
902
906
values : ndarray
903
907
"""
904
908
905
- unique = self .levels [level ]
909
+ values = self .levels [level ]
906
910
labels = self .labels [level ]
907
- filled = algos .take_1d (unique ._values , labels ,
908
- fill_value = unique ._na_value )
909
- values = unique ._shallow_copy (filled )
911
+ if unique :
912
+ labels = algos .unique (labels [labels != - 1 ])
913
+ filled = algos .take_1d (values ._values , labels ,
914
+ fill_value = values ._na_value )
915
+ values = values ._shallow_copy (filled )
910
916
return values
911
917
912
918
def get_level_values (self , level ):
@@ -945,6 +951,34 @@ def get_level_values(self, level):
945
951
values = self ._get_level_values (level )
946
952
return values
947
953
954
+ def unique (self , level = None ):
955
+ """
956
+ Return unique values in the index. Uniques are returned in order
957
+ of appearance, this does NOT sort.
958
+
959
+ Parameters
960
+ ----------
961
+ level : int, optional, defaults None
962
+ only return values from specific level
963
+
964
+ .. versionadded:: 0.21.0
965
+
966
+ Returns
967
+ -------
968
+ Index without duplicates (MultiIndex as long as level=None)
969
+
970
+ See Also
971
+ --------
972
+ unique
973
+ Index.unique
974
+ Series.unique
975
+ """
976
+
977
+ if level is None :
978
+ return super (MultiIndex , self ).unique ()
979
+ else :
980
+ return self ._get_level_values (level = level , unique = True )
981
+
948
982
def format (self , space = 2 , sparsify = None , adjoin = True , names = False ,
949
983
na_rep = None , formatter = None ):
950
984
if len (self ) == 0 :
0 commit comments