@@ -339,9 +339,13 @@ def test_value_counts_unique_nunique(self):
339
339
# freq must be specified because repeat makes freq ambiguous
340
340
expected_index = o [::- 1 ]
341
341
o = klass (np .repeat (values , range (1 , len (o ) + 1 )), freq = o .freq )
342
- else :
342
+ elif isinstance ( o , Index ) :
343
343
expected_index = values [::- 1 ]
344
344
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 )
345
349
346
350
expected_s = Series (range (10 , 0 , - 1 ), index = expected_index , dtype = 'int64' )
347
351
tm .assert_series_equal (o .value_counts (), expected_s )
@@ -374,11 +378,16 @@ def test_value_counts_unique_nunique(self):
374
378
375
379
# create repeated values, 'n'th element is repeated by n+1 times
376
380
if isinstance (o , PeriodIndex ):
381
+ # freq must be specified because repeat makes freq ambiguous
377
382
expected_index = o
378
383
o = klass (np .repeat (values , range (1 , len (o ) + 1 )), freq = o .freq )
379
- else :
384
+ elif isinstance ( o , Index ) :
380
385
expected_index = values
381
386
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 )
382
391
383
392
expected_s_na = Series (list (range (10 , 2 , - 1 )) + [3 ], index = expected_index [9 :0 :- 1 ], dtype = 'int64' )
384
393
expected_s = Series (list (range (10 , 2 , - 1 )), index = expected_index [9 :1 :- 1 ], dtype = 'int64' )
@@ -571,6 +580,63 @@ def test_factorize(self):
571
580
expected = o [5 :].append (o [:5 ])
572
581
self .assertTrue (uniques .equals (expected ))
573
582
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
+
574
640
575
641
class TestDatetimeIndexOps (Ops ):
576
642
tz = [None , 'UTC' , 'Asia/Tokyo' , 'US/Eastern' ,
0 commit comments