@@ -851,31 +851,36 @@ def __getitem__(self, key):
851
851
if key is Ellipsis :
852
852
return self
853
853
854
- try :
855
- result = self .index .get_value (self , key )
854
+ key_is_scalar = is_scalar (key )
856
855
857
- return result
858
- except InvalidIndexError :
859
- pass
860
- except (KeyError , ValueError ):
861
- if isinstance (key , tuple ) and isinstance (self .index , MultiIndex ):
862
- # kludge
863
- pass
864
- elif com .is_bool_indexer (key ):
856
+ if key_is_scalar or isinstance (self .index , MultiIndex ):
857
+ # Otherwise index.get_value will raise InvalidIndexError
858
+ try :
859
+ result = self .index .get_value (self , key )
860
+
861
+ return result
862
+ except InvalidIndexError :
865
863
pass
866
- else :
864
+ except (KeyError , ValueError ):
865
+ if isinstance (key , tuple ) and isinstance (self .index , MultiIndex ):
866
+ # kludge
867
+ pass
868
+ else :
867
869
868
- # we can try to coerce the indexer (or this will raise)
869
- new_key = self .index ._convert_scalar_indexer (key , kind = "getitem" )
870
- if type (new_key ) != type (key ):
871
- return self .__getitem__ (new_key )
872
- raise
870
+ # we can try to coerce the indexer (or this will raise)
871
+ new_key = self .index ._convert_scalar_indexer (key , kind = "getitem" )
872
+ if type (new_key ) != type (key ):
873
+ return self .__getitem__ (new_key )
874
+ raise
873
875
874
- if is_iterator (key ):
875
- key = list (key )
876
+ if not key_is_scalar :
877
+ # avoid expensive checks if we know we have a scalar
878
+ if is_iterator (key ):
879
+ key = list (key )
876
880
877
- if com .is_bool_indexer (key ):
878
- key = check_bool_indexer (self .index , key )
881
+ if com .is_bool_indexer (key ):
882
+ key = check_bool_indexer (self .index , key )
883
+ return self ._get_values (key )
879
884
880
885
return self ._get_with (key )
881
886
@@ -908,6 +913,8 @@ def _get_with(self, key):
908
913
else :
909
914
key_type = lib .infer_dtype (key , skipna = False )
910
915
916
+ # Note: The key_type == "boolean" case should be caught by the
917
+ # com.is_bool_indexer check in __getitem__
911
918
if key_type == "integer" :
912
919
if self .index .is_integer () or self .index .is_floating ():
913
920
return self .loc [key ]
@@ -916,8 +923,6 @@ def _get_with(self, key):
916
923
return self .iloc [indexer ]
917
924
else :
918
925
return self ._get_values (key )
919
- elif key_type == "boolean" :
920
- return self ._get_values (key )
921
926
922
927
if isinstance (key , (list , tuple )):
923
928
# TODO: de-dup with tuple case handled above?
0 commit comments