@@ -339,9 +339,13 @@ def test_value_counts_unique_nunique(self):
339339 # freq must be specified because repeat makes freq ambiguous
340340 expected_index = o [::- 1 ]
341341 o = klass (np .repeat (values , range (1 , len (o ) + 1 )), freq = o .freq )
342- else :
342+ elif isinstance ( o , Index ) :
343343 expected_index = values [::- 1 ]
344344 o = klass (np .repeat (values , range (1 , len (o ) + 1 )))
345+ else :
346+ expected_index = values [::- 1 ]
347+ idx = np .repeat (o .index .values , range (1 , len (o ) + 1 ))
348+ o = klass (np .repeat (values , range (1 , len (o ) + 1 )), index = idx )
345349
346350 expected_s = Series (range (10 , 0 , - 1 ), index = expected_index , dtype = 'int64' )
347351 tm .assert_series_equal (o .value_counts (), expected_s )
@@ -374,11 +378,16 @@ def test_value_counts_unique_nunique(self):
374378
375379 # create repeated values, 'n'th element is repeated by n+1 times
376380 if isinstance (o , PeriodIndex ):
381+ # freq must be specified because repeat makes freq ambiguous
377382 expected_index = o
378383 o = klass (np .repeat (values , range (1 , len (o ) + 1 )), freq = o .freq )
379- else :
384+ elif isinstance ( o , Index ) :
380385 expected_index = values
381386 o = klass (np .repeat (values , range (1 , len (o ) + 1 )))
387+ else :
388+ expected_index = values
389+ idx = np .repeat (o .index .values , range (1 , len (o ) + 1 ))
390+ o = klass (np .repeat (values , range (1 , len (o ) + 1 )), index = idx )
382391
383392 expected_s_na = Series (list (range (10 , 2 , - 1 )) + [3 ], index = expected_index [9 :0 :- 1 ], dtype = 'int64' )
384393 expected_s = Series (list (range (10 , 2 , - 1 )), index = expected_index [9 :1 :- 1 ], dtype = 'int64' )
@@ -571,6 +580,63 @@ def test_factorize(self):
571580 expected = o [5 :].append (o [:5 ])
572581 self .assertTrue (uniques .equals (expected ))
573582
583+ def test_duplicated_drop_duplicates (self ):
584+ # GH 4060
585+ for original in self .objs :
586+
587+ if isinstance (original , Index ):
588+ # original doesn't have duplicates
589+ expected = Index ([False ] * len (original ))
590+ tm .assert_index_equal (original .duplicated (), expected )
591+ result = original .drop_duplicates ()
592+ tm .assert_index_equal (result , original )
593+ self .assertFalse (result is original )
594+
595+ # create repeated values, 3rd and 5th values are duplicated
596+ idx = original [list (range (len (original ))) + [5 , 3 ]]
597+ expected = Index ([False ] * len (original ) + [True , True ])
598+ tm .assert_index_equal (idx .duplicated (), expected )
599+ tm .assert_index_equal (idx .drop_duplicates (), original )
600+
601+ last_base = [False ] * len (idx )
602+ last_base [3 ] = True
603+ last_base [5 ] = True
604+ expected = Index (last_base )
605+ tm .assert_index_equal (idx .duplicated (take_last = True ), expected )
606+ tm .assert_index_equal (idx .drop_duplicates (take_last = True ),
607+ idx [~ np .array (last_base )])
608+
609+ with tm .assertRaisesRegexp (TypeError ,
610+ "drop_duplicates\(\) got an unexpected keyword argument" ):
611+ idx .drop_duplicates (inplace = True )
612+
613+ else :
614+ expected = Series ([False ] * len (original ), index = original .index )
615+ tm .assert_series_equal (original .duplicated (), expected )
616+ result = original .drop_duplicates ()
617+ tm .assert_series_equal (result , original )
618+ self .assertFalse (result is original )
619+
620+ idx = original .index [list (range (len (original ))) + [5 , 3 ]]
621+ values = original .values [list (range (len (original ))) + [5 , 3 ]]
622+ s = Series (values , index = idx )
623+
624+ expected = Series ([False ] * len (original ) + [True , True ], index = idx )
625+ tm .assert_series_equal (s .duplicated (), expected )
626+ tm .assert_series_equal (s .drop_duplicates (), original )
627+
628+ last_base = [False ] * len (idx )
629+ last_base [3 ] = True
630+ last_base [5 ] = True
631+ expected = Series (last_base , index = idx )
632+ expected
633+ tm .assert_series_equal (s .duplicated (take_last = True ), expected )
634+ tm .assert_series_equal (s .drop_duplicates (take_last = True ),
635+ s [~ np .array (last_base )])
636+
637+ s .drop_duplicates (inplace = True )
638+ tm .assert_series_equal (s , original )
639+
574640
575641class TestDatetimeIndexOps (Ops ):
576642 tz = [None , 'UTC' , 'Asia/Tokyo' , 'US/Eastern' ,
0 commit comments