88from pandas .core import common as com
99import pandas .core .nanops as nanops
1010import pandas .tslib as tslib
11+ import pandas .lib as lib
1112from pandas .util .decorators import Appender , cache_readonly
1213
14+
15+ _shared_docs = dict ()
16+ _indexops_doc_kwargs = dict (klass = 'IndexOpsMixin' , inplace = '' )
17+
18+
1319class StringMixin (object ):
1420
1521 """implements string methods so long as object defines a `__unicode__`
@@ -474,12 +480,66 @@ def searchsorted(self, key, side='left'):
474480 #### needs tests/doc-string
475481 return self .values .searchsorted (key , side = side )
476482
483+ _shared_docs ['drop_duplicates' ] = (
484+ """Return %(klass)s with duplicate values removed
485+
486+ Parameters
487+ ----------
488+ take_last : boolean, default False
489+ Take the last observed index in a group. Default first
490+ %(inplace)s
491+
492+ Returns
493+ -------
494+ deduplicated : %(klass)s
495+ """ )
496+
497+ @Appender (_shared_docs ['drop_duplicates' ] % _indexops_doc_kwargs )
498+ def drop_duplicates (self , take_last = False , inplace = False ):
499+ duplicated = self .duplicated (take_last = take_last )
500+ result = self [~ duplicated .values ]
501+ if inplace :
502+ return self ._update_inplace (result )
503+ else :
504+ return result
505+
506+ _shared_docs ['duplicated' ] = (
507+ """Return boolean %(klass)s denoting duplicate values
508+
509+ Parameters
510+ ----------
511+ take_last : boolean, default False
512+ Take the last observed index in a group. Default first
513+
514+ Returns
515+ -------
516+ duplicated : %(klass)s
517+ """ )
518+
519+ @Appender (_shared_docs ['duplicated' ] % _indexops_doc_kwargs )
520+ def duplicated (self , take_last = False ):
521+ keys = com ._ensure_object (self .values )
522+ duplicated = lib .duplicated (keys , take_last = take_last )
523+ try :
524+ return self ._constructor (duplicated ,
525+ index = self .index ).__finalize__ (self )
526+ except AttributeError :
527+ from pandas .core .index import Index
528+ return Index (duplicated )
529+
477530 #----------------------------------------------------------------------
478531 # unbox reductions
479532
480533 all = _unbox (np .ndarray .all )
481534 any = _unbox (np .ndarray .any )
482535
536+ #----------------------------------------------------------------------
537+ # abstracts
538+
539+ def _update_inplace (self , result ):
540+ raise NotImplementedError
541+
542+
483543class DatetimeIndexOpsMixin (object ):
484544 """ common ops mixin to support a unified inteface datetimelike Index """
485545
@@ -497,7 +557,6 @@ def _box_values(self, values):
497557 """
498558 apply box func to passed values
499559 """
500- import pandas .lib as lib
501560 return lib .map_infer (values , self ._box_func )
502561
503562 @cache_readonly
0 commit comments