Skip to content

Commit de49b85

Browse files
committed
Add get_default_index_names method to Index and MultiIndex
1 parent 9e1e16b commit de49b85

File tree

3 files changed

+31
-26
lines changed

3 files changed

+31
-26
lines changed

pandas/core/frame.py

+2-26
Original file line numberDiff line numberDiff line change
@@ -5783,37 +5783,13 @@ class max type
57835783
if len(level) < self.index.nlevels:
57845784
new_index = self.index.droplevel(level)
57855785

5786-
if names is not None:
5787-
if isinstance(self.index, MultiIndex):
5788-
if not isinstance(names, (tuple, list)):
5789-
raise ValueError("Names must be a tuple or list")
5790-
else:
5791-
if not isinstance(names, str):
5792-
raise ValueError("Names must be a string")
5793-
57945786
if not drop:
57955787
to_insert: Iterable[tuple[Any, Any | None]]
57965788
if isinstance(self.index, MultiIndex):
5797-
if not names:
5798-
names = [
5799-
(n if n is not None else f"level_{i}")
5800-
for i, n in enumerate(self.index.names)
5801-
]
5802-
else:
5803-
5804-
if len(names) != self.index.nlevels:
5805-
raise ValueError(
5806-
f"The number of provided names "
5807-
f"({len(names)}) does not match the number of"
5808-
f" MultiIndex levels ({self.index.nlevels})"
5809-
)
5789+
names = self.index.get_default_index_names(names)
58105790
to_insert = zip(self.index.levels, self.index.codes)
58115791
else:
5812-
default = "index" if "index" not in self else "level_0"
5813-
if not names:
5814-
names = [default] if self.index.name is None else [self.index.name]
5815-
else:
5816-
names = [names]
5792+
names = self.index.get_default_index_names(self, names)
58175793
to_insert = ((self.index, None),)
58185794

58195795
multi_col = isinstance(self.columns, MultiIndex)

pandas/core/indexes/base.py

+10
Original file line numberDiff line numberDiff line change
@@ -1559,6 +1559,16 @@ def _validate_names(
15591559

15601560
return new_names
15611561

1562+
def get_default_index_names(self, df: DataFrame, names: str = None) -> str:
1563+
if names is not None and not isinstance(names, str):
1564+
raise ValueError("Names must be a string")
1565+
default = "index" if "index" not in self else "level_0"
1566+
if not names:
1567+
names = [default] if df.index.name is None else [df.index.name]
1568+
else:
1569+
names = [names]
1570+
return names
1571+
15621572
def _get_names(self) -> FrozenList:
15631573
return FrozenList((self.name,))
15641574

pandas/core/indexes/multi.py

+19
Original file line numberDiff line numberDiff line change
@@ -1390,6 +1390,25 @@ def format(
13901390
# --------------------------------------------------------------------
13911391
# Names Methods
13921392

1393+
def get_default_index_names(self, names=None):
1394+
1395+
if names is not None and not isinstance(names, (tuple, list)):
1396+
raise ValueError("Names must be a tuple or list")
1397+
1398+
if not names:
1399+
names = [
1400+
(n if n is not None else f"level_{i}") for i, n in enumerate(self.names)
1401+
]
1402+
else:
1403+
if len(names) != self.index.nlevels:
1404+
raise ValueError(
1405+
f"The number of provided names "
1406+
f"({len(names)}) does not match the number of"
1407+
f" MultiIndex levels ({self.index.nlevels})"
1408+
)
1409+
1410+
return names
1411+
13931412
def _get_names(self) -> FrozenList:
13941413
return FrozenList(self._names)
13951414

0 commit comments

Comments
 (0)