@@ -5639,6 +5639,12 @@ def reset_index(
5639
5639
col_fill : object, default ''
5640
5640
If the columns have multiple levels, determines how the other
5641
5641
levels are named. If None then the index name is repeated.
5642
+ 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.
5646
+
5647
+ .. versionadded:: 1.4.0
5642
5648
5643
5649
Returns
5644
5650
-------
@@ -5781,6 +5787,14 @@ class max type
5781
5787
if len (level ) < self .index .nlevels :
5782
5788
new_index = self .index .droplevel (level )
5783
5789
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
+
5784
5798
if not drop :
5785
5799
to_insert : Iterable [tuple [Any , Any | None ]]
5786
5800
if isinstance (self .index , MultiIndex ):
@@ -5789,6 +5803,14 @@ class max type
5789
5803
(n if n is not None else f"level_{ i } " )
5790
5804
for i , n in enumerate (self .index .names )
5791
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
+ )
5792
5814
to_insert = zip (self .index .levels , self .index .codes )
5793
5815
else :
5794
5816
default = "index" if "index" not in self else "level_0"
0 commit comments