@@ -480,10 +480,10 @@ def to_int():
480
480
if is_integer (key ):
481
481
return key
482
482
elif is_float (key ):
483
- if not self . is_floating ():
484
- warnings .warn ("scalar indexers for index type {0} should be integers and not floating point" .format (
485
- type (self ).__name__ ),FutureWarning )
486
- return to_int ()
483
+ key = to_int ()
484
+ warnings .warn ("scalar indexers for index type {0} should be integers and not floating point" .format (
485
+ type (self ).__name__ ),FutureWarning )
486
+ return key
487
487
return self ._convert_indexer_error (key , 'label' )
488
488
489
489
if is_float (key ):
@@ -498,17 +498,9 @@ def _validate_slicer(self, key, f):
498
498
""" validate and raise if needed on a slice indexers according to the
499
499
passed in function """
500
500
501
- if not f (key .start ):
502
- self ._convert_indexer_error (key .start , 'slice start value' )
503
- if not f (key .stop ):
504
- self ._convert_indexer_error (key .stop , 'slice stop value' )
505
- if not f (key .step ):
506
- self ._convert_indexer_error (key .step , 'slice step value' )
507
-
508
- def _convert_slice_indexer_iloc (self , key ):
509
- """ convert a slice indexer for iloc only """
510
- self ._validate_slicer (key , lambda v : v is None or is_integer (v ))
511
- return key
501
+ for c in ['start' ,'stop' ,'step' ]:
502
+ if not f (getattr (key ,c )):
503
+ self ._convert_indexer_error (key .start , 'slice {0} value' .format (c ))
512
504
513
505
def _convert_slice_indexer_getitem (self , key , is_index_slice = False ):
514
506
""" called from the getitem slicers, determine how to treat the key
@@ -520,6 +512,25 @@ def _convert_slice_indexer_getitem(self, key, is_index_slice=False):
520
512
def _convert_slice_indexer (self , key , typ = None ):
521
513
""" convert a slice indexer. disallow floats in the start/stop/step """
522
514
515
+ # validate iloc
516
+ if typ == 'iloc' :
517
+
518
+ # need to coerce to_int if needed
519
+ def f (c ):
520
+ v = getattr (key ,c )
521
+ if v is None or is_integer (v ):
522
+ return v
523
+
524
+ # warn if its a convertible float
525
+ if v == int (v ):
526
+ warnings .warn ("slice indexers when using iloc should be integers "
527
+ "and not floating point" ,FutureWarning )
528
+ return int (v )
529
+
530
+ self ._convert_indexer_error (v , 'slice {0} value' .format (c ))
531
+
532
+ return slice (* [ f (c ) for c in ['start' ,'stop' ,'step' ]])
533
+
523
534
# validate slicers
524
535
def validate (v ):
525
536
if v is None or is_integer (v ):
@@ -530,7 +541,6 @@ def validate(v):
530
541
return False
531
542
532
543
return True
533
-
534
544
self ._validate_slicer (key , validate )
535
545
536
546
# figure out if this is a positional indexer
@@ -543,9 +553,7 @@ def is_int(v):
543
553
is_index_slice = is_int (start ) and is_int (stop )
544
554
is_positional = is_index_slice and not self .is_integer ()
545
555
546
- if typ == 'iloc' :
547
- return self ._convert_slice_indexer_iloc (key )
548
- elif typ == 'getitem' :
556
+ if typ == 'getitem' :
549
557
return self ._convert_slice_indexer_getitem (
550
558
key , is_index_slice = is_index_slice )
551
559
@@ -1980,7 +1988,7 @@ def _convert_slice_indexer(self, key, typ=None):
1980
1988
""" convert a slice indexer, by definition these are labels
1981
1989
unless we are iloc """
1982
1990
if typ == 'iloc' :
1983
- return self . _convert_slice_indexer_iloc (key )
1991
+ return super ( Float64Index , self ). _convert_slice_indexer (key , typ = typ )
1984
1992
1985
1993
# allow floats here
1986
1994
self ._validate_slicer (
@@ -2386,14 +2394,6 @@ def __unicode__(self):
2386
2394
def __len__ (self ):
2387
2395
return len (self .labels [0 ])
2388
2396
2389
- def _convert_slice_indexer (self , key , typ = None ):
2390
- """ convert a slice indexer. disallow floats in the start/stop/step """
2391
-
2392
- if typ == 'iloc' :
2393
- return self ._convert_slice_indexer_iloc (key )
2394
-
2395
- return super (MultiIndex , self )._convert_slice_indexer (key , typ = typ )
2396
-
2397
2397
def _get_names (self ):
2398
2398
return FrozenList (level .name for level in self .levels )
2399
2399
@@ -2997,7 +2997,7 @@ def _drop_from_level(self, labels, level):
2997
2997
index = self .levels [i ]
2998
2998
values = index .get_indexer (labels )
2999
2999
3000
- mask = - lib .ismember (self .labels [i ], set (values ))
3000
+ mask = ~ lib .ismember (self .labels [i ], set (values ))
3001
3001
3002
3002
return self [mask ]
3003
3003
0 commit comments