@@ -2091,6 +2091,12 @@ def _validate_index_level(self, level) -> None:
20912091 f"Requested level ({ level } ) does not match index name ({ self .name } )"
20922092 )
20932093
2094+ # Handle NA-like index.name as well
2095+ if isna (self .name ):
2096+ raise KeyError (
2097+ f"Requested level ({ level } ) does not match index name ({ self .name } )"
2098+ )
2099+
20942100 # Reject booleans unless the index name is actually a boolean and matches
20952101 if isinstance (level , bool ):
20962102 if level != self .name :
@@ -2102,20 +2108,24 @@ def _validate_index_level(self, level) -> None:
21022108 # Integer-like levels
21032109 if lib .is_integer (level ):
21042110 # Exclude bools (already handled above)
2111+ if isinstance (self .name , int ) and level == self .name :
2112+ return
21052113 if level < 0 and level != - 1 :
21062114 raise IndexError (
2107- "Too many levels: Index has only 1 level, "
2108- f"{ level } is not a valid level number"
2115+ "Too many levels: Index has only 1 level, not {}" .format (level + 1 )
21092116 )
2110- if level > 0 :
2111- raise IndexError (
2112- f"Too many levels: Index has only 1 level, not { level + 1 } "
2117+ return
2118+
2119+ # For string-level, require both to be strings and equal
2120+ if isinstance (level , str ) and isinstance (self .name , str ):
2121+ if level != self .name :
2122+ raise KeyError (
2123+ f"Requested level ({ level } ) does not match index name ({ self .name } )"
21132124 )
21142125 return
21152126
21162127 # For all other types, require exact match to index name
2117- # Use pandas' isna for both level and self.name to catch NA-like names
2118- if isna (self .name ) or level != self .name :
2128+ if level != self .name :
21192129 raise KeyError (
21202130 f"Requested level ({ level } ) does not match index name ({ self .name } )"
21212131 )
0 commit comments