@@ -2091,6 +2091,12 @@ def _validate_index_level(self, level) -> None:
2091
2091
f"Requested level ({ level } ) does not match index name ({ self .name } )"
2092
2092
)
2093
2093
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
+
2094
2100
# Reject booleans unless the index name is actually a boolean and matches
2095
2101
if isinstance (level , bool ):
2096
2102
if level != self .name :
@@ -2102,20 +2108,24 @@ def _validate_index_level(self, level) -> None:
2102
2108
# Integer-like levels
2103
2109
if lib .is_integer (level ):
2104
2110
# Exclude bools (already handled above)
2111
+ if isinstance (self .name , int ) and level == self .name :
2112
+ return
2105
2113
if level < 0 and level != - 1 :
2106
2114
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 )
2109
2116
)
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 } )"
2113
2124
)
2114
2125
return
2115
2126
2116
2127
# 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 :
2119
2129
raise KeyError (
2120
2130
f"Requested level ({ level } ) does not match index name ({ self .name } )"
2121
2131
)
0 commit comments