Skip to content

Commit 928393d

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

File tree

3 files changed

+36
-29
lines changed

3 files changed

+36
-29
lines changed

pandas/core/frame.py

+5-29
Original file line numberDiff line numberDiff line change
@@ -5636,9 +5636,9 @@ def reset_index(
56365636
If the columns have multiple levels, determines how the other
56375637
levels are named. If None then the index name is repeated.
56385638
names : str, tuple or list, default None
5639-
Using the given string, rename the DataFrame column which contains the index data.
5640-
If the DataFrame has a MultiIndex, this has to be a list or tuple with length
5641-
equal to the number of levels.
5639+
Using the given string, rename the DataFrame column which contains the
5640+
index data. If the DataFrame has a MultiIndex, this has to be a list or
5641+
tuple with length equal to the number of levels.
56425642
56435643
.. versionadded:: 1.4.0
56445644
@@ -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

+12
Original file line numberDiff line numberDiff line change
@@ -1559,6 +1559,18 @@ def _validate_names(
15591559

15601560
return new_names
15611561

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

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)