@@ -851,31 +851,36 @@ def __getitem__(self, key):
851851 if key is Ellipsis :
852852 return self
853853
854- try :
855- result = self .index .get_value (self , key )
854+ key_is_scalar = is_scalar (key )
856855
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 :
865863 pass
866- else :
864+ except (KeyError , ValueError ):
865+ if isinstance (key , tuple ) and isinstance (self .index , MultiIndex ):
866+ # kludge
867+ pass
868+ else :
867869
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
873875
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 )
876880
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 )
879884
880885 return self ._get_with (key )
881886
@@ -908,6 +913,8 @@ def _get_with(self, key):
908913 else :
909914 key_type = lib .infer_dtype (key , skipna = False )
910915
916+ # Note: The key_type == "boolean" case should be caught by the
917+ # com.is_bool_indexer check in __getitem__
911918 if key_type == "integer" :
912919 if self .index .is_integer () or self .index .is_floating ():
913920 return self .loc [key ]
@@ -916,8 +923,6 @@ def _get_with(self, key):
916923 return self .iloc [indexer ]
917924 else :
918925 return self ._get_values (key )
919- elif key_type == "boolean" :
920- return self ._get_values (key )
921926
922927 if isinstance (key , (list , tuple )):
923928 # TODO: de-dup with tuple case handled above?
0 commit comments