Skip to content

Commit feee467

Browse files
authored
PERF: avoid is_bool_indexer check where possible (#31399)
1 parent 06384b7 commit feee467

File tree

1 file changed

+27
-22
lines changed

1 file changed

+27
-22
lines changed

pandas/core/series.py

+27-22
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)