@@ -3451,6 +3451,69 @@ def test_has_duplicates(self):
34513451 [0 , 1 , 2 , 0 , 0 , 1 , 2 ]])
34523452 self .assertTrue (index .has_duplicates )
34533453
3454+ # GH 9075
3455+ t = [(u'x' , u'out' , u'z' , 5 , u'y' , u'in' , u'z' , 169 ),
3456+ (u'x' , u'out' , u'z' , 7 , u'y' , u'in' , u'z' , 119 ),
3457+ (u'x' , u'out' , u'z' , 9 , u'y' , u'in' , u'z' , 135 ),
3458+ (u'x' , u'out' , u'z' , 13 , u'y' , u'in' , u'z' , 145 ),
3459+ (u'x' , u'out' , u'z' , 14 , u'y' , u'in' , u'z' , 158 ),
3460+ (u'x' , u'out' , u'z' , 16 , u'y' , u'in' , u'z' , 122 ),
3461+ (u'x' , u'out' , u'z' , 17 , u'y' , u'in' , u'z' , 160 ),
3462+ (u'x' , u'out' , u'z' , 18 , u'y' , u'in' , u'z' , 180 ),
3463+ (u'x' , u'out' , u'z' , 20 , u'y' , u'in' , u'z' , 143 ),
3464+ (u'x' , u'out' , u'z' , 21 , u'y' , u'in' , u'z' , 128 ),
3465+ (u'x' , u'out' , u'z' , 22 , u'y' , u'in' , u'z' , 129 ),
3466+ (u'x' , u'out' , u'z' , 25 , u'y' , u'in' , u'z' , 111 ),
3467+ (u'x' , u'out' , u'z' , 28 , u'y' , u'in' , u'z' , 114 ),
3468+ (u'x' , u'out' , u'z' , 29 , u'y' , u'in' , u'z' , 121 ),
3469+ (u'x' , u'out' , u'z' , 31 , u'y' , u'in' , u'z' , 126 ),
3470+ (u'x' , u'out' , u'z' , 32 , u'y' , u'in' , u'z' , 155 ),
3471+ (u'x' , u'out' , u'z' , 33 , u'y' , u'in' , u'z' , 123 ),
3472+ (u'x' , u'out' , u'z' , 12 , u'y' , u'in' , u'z' , 144 )]
3473+
3474+ index = pd .MultiIndex .from_tuples (t )
3475+ self .assertFalse (index .has_duplicates )
3476+
3477+ # handle int64 overflow if possible
3478+ def check (nlevels , with_nulls ):
3479+ labels = np .tile (np .arange (500 ), 2 )
3480+ level = np .arange (500 )
3481+
3482+ if with_nulls : # inject some null values
3483+ labels [500 ] = - 1 # common nan value
3484+ labels = list (labels .copy () for i in range (nlevels ))
3485+ for i in range (nlevels ):
3486+ labels [i ][500 + i - nlevels // 2 ] = - 1
3487+
3488+ labels += [np .array ([- 1 , 1 ]).repeat (500 )]
3489+ else :
3490+ labels = [labels ] * nlevels + [np .arange (2 ).repeat (500 )]
3491+
3492+ levels = [level ] * nlevels + [[0 , 1 ]]
3493+
3494+ # no dups
3495+ index = MultiIndex (levels = levels , labels = labels )
3496+ self .assertFalse (index .has_duplicates )
3497+
3498+ # with a dup
3499+ if with_nulls :
3500+ f = lambda a : np .insert (a , 1000 , a [0 ])
3501+ labels = list (map (f , labels ))
3502+ index = MultiIndex (levels = levels , labels = labels )
3503+ else :
3504+ values = index .values .tolist ()
3505+ index = MultiIndex .from_tuples (values + [values [0 ]])
3506+
3507+ self .assertTrue (index .has_duplicates )
3508+
3509+ # no overflow
3510+ check (4 , False )
3511+ check (4 , True )
3512+
3513+ # overflow possible
3514+ check (8 , False )
3515+ check (8 , True )
3516+
34543517 def test_tolist (self ):
34553518 result = self .index .tolist ()
34563519 exp = list (self .index .values )
0 commit comments