@@ -268,6 +268,10 @@ def get_indexer(self, target, method=None):
268
268
target .indexMap , method )
269
269
return indexer , mask
270
270
271
+ def reindex (self , target , method = None ):
272
+ indexer , mask = self .get_indexer (target , method = method )
273
+ return target , indexer , mask
274
+
271
275
def slice_locs (self , start = None , end = None ):
272
276
"""
273
277
@@ -300,6 +304,13 @@ def delete(self, loc):
300
304
arr = np .delete (np .asarray (self ), loc )
301
305
return Index (arr )
302
306
307
+ def drop (self , labels ):
308
+ labels = np .asarray (list (labels ), dtype = object )
309
+ indexer , mask = self .get_indexer (labels )
310
+ if not mask .all ():
311
+ raise ValueError ('labels %s not contained in axis' % labels [- mask ])
312
+ return self .delete (indexer )
313
+
303
314
class DateIndex (Index ):
304
315
pass
305
316
@@ -486,6 +497,25 @@ def take(self, *args, **kwargs):
486
497
new_labels = [lab .take (* args , ** kwargs ) for lab in self .labels ]
487
498
return MultiIndex (levels = self .levels , labels = new_labels )
488
499
500
+ def drop (self , labels ):
501
+ try :
502
+ arr = np .asarray (list (labels ), dtype = object )
503
+ indexer , mask = self .get_indexer (arr )
504
+ if not mask .all ():
505
+ raise ValueError ('labels %s not contained in axis' % arr [- mask ])
506
+ except Exception :
507
+ pass
508
+
509
+ inds = []
510
+ for label in labels :
511
+ loc = self .get_loc (label )
512
+ if isinstance (loc , int ):
513
+ inds .append (loc )
514
+ else :
515
+ inds .extend (range (loc .start , loc .stop ))
516
+
517
+ return self .delete (inds )
518
+
489
519
def droplevel (self , level = 0 ):
490
520
"""
491
521
Return Index with requested level removed. If MultiIndex has only 2
@@ -556,17 +586,32 @@ def get_indexer(self, target, method=None):
556
586
}
557
587
method = aliases .get (method , method )
558
588
559
- if not isinstance (target , MultiIndex ):
560
- raise TypeError ('Can only align with other MultiIndex objects' )
589
+ if isinstance (target , MultiIndex ):
590
+ target_index = target .get_tuple_index ()
591
+ else :
592
+ if len (target ) > 0 :
593
+ val = target [0 ]
594
+ if not isinstance (val , tuple ) or len (val ) != self .nlevels :
595
+ raise ValueError ('can only pass MultiIndex or '
596
+ 'array of tuples' )
561
597
562
- self_index = self .get_tuple_index ()
563
- target_index = target .get_tuple_index ()
598
+ target_index = target
564
599
600
+ self_index = self .get_tuple_index ()
565
601
indexer , mask = _tseries .getFillVec (self_index , target_index ,
566
602
self_index .indexMap ,
567
- target_index .indexMap , method )
603
+ target .indexMap , method )
568
604
return indexer , mask
569
605
606
+ def reindex (self , target , method = None ):
607
+ indexer , mask = self .get_indexer (target , method = method )
608
+
609
+ # hopefully?
610
+ if not isinstance (target , MultiIndex ):
611
+ target = MultiIndex .from_tuples (target )
612
+
613
+ return target , indexer , mask
614
+
570
615
def get_tuple_index (self ):
571
616
return Index (list (self ))
572
617
@@ -699,14 +744,18 @@ def equals(self, other):
699
744
if len (self ) != len (other ):
700
745
return False
701
746
702
- # if not self.equal_levels(other):
703
- # return False
704
-
705
747
for i in xrange (self .nlevels ):
706
- if not self .levels [i ].equals (other .levels [i ]):
707
- return False
708
- if not np .array_equal (self .labels [i ], other .labels [i ]):
748
+ svalues = np .asarray (self .levels [i ]).take (self .labels [i ])
749
+ ovalues = np .asarray (other .levels [i ]).take (other .labels [i ])
750
+
751
+ if not np .array_equal (svalues , ovalues ):
709
752
return False
753
+
754
+ # if not self.levels[i].equals(other.levels[i]):
755
+ # return False
756
+ # if not np.array_equal(self.labels[i], other.labels[i]):
757
+ # return False
758
+
710
759
return True
711
760
712
761
def equal_levels (self , other ):
0 commit comments