Skip to content

Commit 7f541de

Browse files
committed
BUG: Enhance index level validation to handle NA-like index names and improve error messaging
1 parent 3e63865 commit 7f541de

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

pandas/_libs/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
__all__ = [
2-
"NA",
32
"Interval",
43
"NaT",
54
"NaTType",
@@ -17,7 +16,6 @@
1716
import pandas._libs.pandas_parser # isort: skip # type: ignore[reportUnusedImport]
1817
import pandas._libs.pandas_datetime # noqa: F401 # isort: skip # type: ignore[reportUnusedImport]
1918
from pandas._libs.interval import Interval
20-
from pandas._libs.missing import NA
2119
from pandas._libs.tslibs import (
2220
NaT,
2321
NaTType,

pandas/core/indexes/base.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)