Skip to content

Commit 1705967

Browse files
committed
Add get_default_index_names method to Index and MultiIndex
1 parent aa7cb2a commit 1705967

File tree

3 files changed

+32
-26
lines changed

3 files changed

+32
-26
lines changed

pandas/core/frame.py

+2-26
Original file line numberDiff line numberDiff line change
@@ -5762,37 +5762,13 @@ class max type
57625762
if len(level) < self.index.nlevels:
57635763
new_index = self.index.droplevel(level)
57645764

5765-
if names is not None:
5766-
if isinstance(self.index, MultiIndex):
5767-
if not isinstance(names, (tuple, list)):
5768-
raise ValueError("Names must be a tuple or list")
5769-
else:
5770-
if not isinstance(names, str):
5771-
raise ValueError("Names must be a string")
5772-
57735765
if not drop:
57745766
to_insert: Iterable[tuple[Any, Any | None]]
57755767
if isinstance(self.index, MultiIndex):
5776-
if not names:
5777-
names = [
5778-
(n if n is not None else f"level_{i}")
5779-
for i, n in enumerate(self.index.names)
5780-
]
5781-
else:
5782-
5783-
if len(names) != self.index.nlevels:
5784-
raise ValueError(
5785-
f"The number of provided names "
5786-
f"({len(names)}) does not match the number of"
5787-
f" MultiIndex levels ({self.index.nlevels})"
5788-
)
5768+
names = self.index.get_default_index_names(names)
57895769
to_insert = zip(self.index.levels, self.index.codes)
57905770
else:
5791-
default = "index" if "index" not in self else "level_0"
5792-
if not names:
5793-
names = [default] if self.index.name is None else [self.index.name]
5794-
else:
5795-
names = [names]
5771+
names = self.index.get_default_index_names(self, names)
57965772
to_insert = ((self.index, None),)
57975773

57985774
multi_col = isinstance(self.columns, MultiIndex)

pandas/core/indexes/base.py

+10
Original file line numberDiff line numberDiff line change
@@ -1497,6 +1497,16 @@ def _validate_names(
14971497

14981498
return new_names
14991499

1500+
def get_default_index_names(self, df:DataFrame, names:str=None) -> str:
1501+
if names is not None and not isinstance(names, str):
1502+
raise ValueError("Names must be a string")
1503+
default = "index" if "index" not in self else "level_0"
1504+
if not names:
1505+
names = [default] if df.index.name is None else [df.index.name]
1506+
else:
1507+
names = [names]
1508+
return names
1509+
15001510
def _get_names(self) -> FrozenList:
15011511
return FrozenList((self.name,))
15021512

pandas/core/indexes/multi.py

+20
Original file line numberDiff line numberDiff line change
@@ -1391,6 +1391,26 @@ 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}")
1402+
for i, n in enumerate(self.names)
1403+
]
1404+
else:
1405+
if len(names) != self.index.nlevels:
1406+
raise ValueError(
1407+
f"The number of provided names "
1408+
f"({len(names)}) does not match the number of"
1409+
f" MultiIndex levels ({self.index.nlevels})"
1410+
)
1411+
1412+
return names
1413+
13941414
def _get_names(self) -> FrozenList:
13951415
return FrozenList(self._names)
13961416

0 commit comments

Comments
 (0)