diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 59ac122e4f9ea..83d55b9deae8a 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2084,16 +2084,34 @@ def _validate_index_level(self, level) -> None: verification must be done like in MultiIndex. """ - if isinstance(level, int): + if isna(level) and isna(self.name): + return + + elif isna(level) or isna(self.name): + raise KeyError( + f"Requested level ({level}) does not match index name ({self.name})" + ) + + elif lib.is_integer(level): + if isinstance(self.name, int) and level == self.name: + return if level < 0 and level != -1: raise IndexError( - "Too many levels: Index has only 1 level, " - f"{level} is not a valid level number" + f"Too many levels: Index has only 1 level, not {level + 1}" ) - if level > 0: + elif level > 0: raise IndexError( f"Too many levels: Index has only 1 level, not {level + 1}" ) + return + + elif isinstance(level, str) and isinstance(self.name, str): + if level != self.name: + raise KeyError( + f"Requested level ({level}) does not match index name ({self.name})" + ) + return + elif level != self.name: raise KeyError( f"Requested level ({level}) does not match index name ({self.name})"