Skip to content

Commit 6f4cd27

Browse files
committed
Add get_default_index_names method to Index and MultiIndex
1 parent dffa527 commit 6f4cd27

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
@@ -5640,9 +5640,9 @@ def reset_index(
56405640
If the columns have multiple levels, determines how the other
56415641
levels are named. If None then the index name is repeated.
56425642
names : str, tuple or list, default None
5643-
Using the given string, rename the DataFrame column which contains the index data.
5644-
If the DataFrame has a MultiIndex, this has to be a list or tuple with length
5645-
equal to the number of levels.
5643+
Using the given string, rename the DataFrame column which contains the
5644+
index data. If the DataFrame has a MultiIndex, this has to be a list or
5645+
tuple with length equal to the number of levels.
56465646
56475647
.. versionadded:: 1.4.0
56485648
@@ -5787,37 +5787,13 @@ class max type
57875787
if len(level) < self.index.nlevels:
57885788
new_index = self.index.droplevel(level)
57895789

5790-
if names is not None:
5791-
if isinstance(self.index, MultiIndex):
5792-
if not isinstance(names, (tuple, list)):
5793-
raise ValueError("Names must be a tuple or list")
5794-
else:
5795-
if not isinstance(names, str):
5796-
raise ValueError("Names must be a string")
5797-
57985790
if not drop:
57995791
to_insert: Iterable[tuple[Any, Any | None]]
58005792
if isinstance(self.index, MultiIndex):
5801-
if not names:
5802-
names = [
5803-
(n if n is not None else f"level_{i}")
5804-
for i, n in enumerate(self.index.names)
5805-
]
5806-
else:
5807-
5808-
if len(names) != self.index.nlevels:
5809-
raise ValueError(
5810-
f"The number of provided names "
5811-
f"({len(names)}) does not match the number of"
5812-
f" MultiIndex levels ({self.index.nlevels})"
5813-
)
5793+
names = self.index.get_default_index_names(names)
58145794
to_insert = zip(self.index.levels, self.index.codes)
58155795
else:
5816-
default = "index" if "index" not in self else "level_0"
5817-
if not names:
5818-
names = [default] if self.index.name is None else [self.index.name]
5819-
else:
5820-
names = [names]
5796+
names = self.index.get_default_index_names(self, names)
58215797
to_insert = ((self.index, None),)
58225798

58235799
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
@@ -1391,6 +1391,25 @@ def format(
13911391
# --------------------------------------------------------------------
13921392
# Names Methods
13931393

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

0 commit comments

Comments
 (0)