def reset_index(self, level=None, drop=False, inplace=False, col_level=<NUM_LIT:0>,<EOL>col_fill='<STR_LIT>'):
inplace = validate_bool_kwarg(inplace, '<STR_LIT>')<EOL>if inplace:<EOL><INDENT>new_obj = self<EOL><DEDENT>else:<EOL><INDENT>new_obj = self.copy()<EOL><DEDENT>def _maybe_casted_values(index, labels=None):<EOL><INDENT>values = index._values<EOL>if not isinstance(index, (PeriodIndex, DatetimeIndex)):<EOL><INDENT>if values.dtype == np.object_:<EOL><INDENT>values = lib.maybe_convert_objects(values)<EOL><DEDENT><DEDENT>if labels is not None:<EOL><INDENT>mask = labels == -<NUM_LIT:1><EOL>if mask.all():<EOL><INDENT>values = np.empty(len(mask))<EOL>values.fill(np.nan)<EOL><DEDENT>else:<EOL><INDENT>values = values.take(labels)<EOL>values_type = type(values)<EOL>values_dtype = values.dtype<EOL>if issubclass(values_type, DatetimeLikeArray):<EOL><INDENT>values = values._data<EOL><DEDENT>if mask.any():<EOL><INDENT>values, changed = maybe_upcast_putmask(<EOL>values, mask, np.nan)<EOL><DEDENT>if issubclass(values_type, DatetimeLikeArray):<EOL><INDENT>values = values_type(values, dtype=values_dtype)<EOL><DEDENT><DEDENT><DEDENT>return values<EOL><DEDENT>new_index = ibase.default_index(len(new_obj))<EOL>if level is not None:<EOL><INDENT>if not isinstance(level, (tuple, list)):<EOL><INDENT>level = [level]<EOL><DEDENT>level = [self.index._get_level_number(lev) for lev in level]<EOL>if len(level) < self.index.nlevels:<EOL><INDENT>new_index = self.index.droplevel(level)<EOL><DEDENT><DEDENT>if not drop:<EOL><INDENT>if isinstance(self.index, MultiIndex):<EOL><INDENT>names = [n if n is not None else ('<STR_LIT>' % i)<EOL>for (i, n) in enumerate(self.index.names)]<EOL>to_insert = lzip(self.index.levels, self.index.codes)<EOL><DEDENT>else:<EOL><INDENT>default = '<STR_LIT:index>' if '<STR_LIT:index>' not in self else '<STR_LIT>'<EOL>names = ([default] if self.index.name is None<EOL>else [self.index.name])<EOL>to_insert = ((self.index, None),)<EOL><DEDENT>multi_col = isinstance(self.columns, MultiIndex)<EOL>for i, (lev, lab) in reversed(list(enumerate(to_insert))):<EOL><INDENT>if not (level is None or i in level):<EOL><INDENT>continue<EOL><DEDENT>name = names[i]<EOL>if multi_col:<EOL><INDENT>col_name = (list(name) if isinstance(name, tuple)<EOL>else [name])<EOL>if col_fill is None:<EOL><INDENT>if len(col_name) not in (<NUM_LIT:1>, self.columns.nlevels):<EOL><INDENT>raise ValueError("<STR_LIT>"<EOL>"<STR_LIT>"<EOL>"<STR_LIT:{}>".format(name))<EOL><DEDENT>col_fill = col_name[<NUM_LIT:0>]<EOL><DEDENT>lev_num = self.columns._get_level_number(col_level)<EOL>name_lst = [col_fill] * lev_num + col_name<EOL>missing = self.columns.nlevels - len(name_lst)<EOL>name_lst += [col_fill] * missing<EOL>name = tuple(name_lst)<EOL><DEDENT>level_values = _maybe_casted_values(lev, lab)<EOL>new_obj.insert(<NUM_LIT:0>, name, level_values)<EOL><DEDENT><DEDENT>new_obj.index = new_index<EOL>if not inplace:<EOL><INDENT>return new_obj<EOL><DEDENT>
Reset the index, or a level of it.

Reset the index of the DataFrame, and use the default one instead.
If the DataFrame has a MultiIndex, this method can remove one or more
levels.

Parameters
----------
level : int, str, tuple, or list, default None
    Only remove the given levels from the index. Removes all levels by
    default.
drop : bool, default False
    Do not try to insert index into dataframe columns. This resets
    the index to the default integer index.
inplace : bool, default False
    Modify the DataFrame in place (do not create a new object).
col_level : int or str, default 0
    If the columns have multiple levels, determines which level the
    labels are inserted into. By default it is inserted into the first
    level.
col_fill : object, default ''
    If the columns have multiple levels, determines how the other
    levels are named. If None then the index name is repeated.

Returns
-------
DataFrame
    DataFrame with the new index.

See Also
--------
DataFrame.set_index : Opposite of reset_index.
DataFrame.reindex : Change to new indices or expand indices.
DataFrame.reindex_like : Change to same indices as other DataFrame.

Examples
--------
>>> df = pd.DataFrame([('bird', 389.0),
...                    ('bird', 24.0),
...                    ('mammal', 80.5),
...                    ('mammal', np.nan)],
...                   index=['falcon', 'parrot', 'lion', 'monkey'],
...                   columns=('class', 'max_speed'))
>>> df
         class  max_speed
falcon    bird      389.0
parrot    bird       24.0
lion    mammal       80.5
monkey  mammal        NaN

When we reset the index, the old index is added as a column, and a
new sequential index is used:

>>> df.reset_index()
    index   class  max_speed
0  falcon    bird      389.0
1  parrot    bird       24.0
2    lion  mammal       80.5
3  monkey  mammal        NaN

We can use the `drop` parameter to avoid the old index being added as
a column:

>>> df.reset_index(drop=True)
    class  max_speed
0    bird      389.0
1    bird       24.0
2  mammal       80.5
3  mammal        NaN

You can also use `reset_index` with `MultiIndex`.

>>> index = pd.MultiIndex.from_tuples([('bird', 'falcon'),
...                                    ('bird', 'parrot'),
...                                    ('mammal', 'lion'),
...                                    ('mammal', 'monkey')],
...                                   names=['class', 'name'])
>>> columns = pd.MultiIndex.from_tuples([('speed', 'max'),
...                                      ('species', 'type')])
>>> df = pd.DataFrame([(389.0, 'fly'),
...                    ( 24.0, 'fly'),
...                    ( 80.5, 'run'),
...                    (np.nan, 'jump')],
...                   index=index,
...                   columns=columns)
>>> df
               speed species
                 max    type
class  name
bird   falcon  389.0     fly
       parrot   24.0     fly
mammal lion     80.5     run
       monkey    NaN    jump

If the index has multiple levels, we can reset a subset of them:

>>> df.reset_index(level='class')
         class  speed species
                  max    type
name
falcon    bird  389.0     fly
parrot    bird   24.0     fly
lion    mammal   80.5     run
monkey  mammal    NaN    jump

If we are not dropping the index, by default, it is placed in the top
level. We can place it in another level:

>>> df.reset_index(level='class', col_level=1)
                speed species
         class    max    type
name
falcon    bird  389.0     fly
parrot    bird   24.0     fly
lion    mammal   80.5     run
monkey  mammal    NaN    jump

When the index is inserted under another level, we can specify under
which one with the parameter `col_fill`:

>>> df.reset_index(level='class', col_level=1, col_fill='species')
              species  speed species
                class    max    type
name
falcon           bird  389.0     fly
parrot           bird   24.0     fly
lion           mammal   80.5     run
monkey         mammal    NaN    jump

If we specify a nonexistent level for `col_fill`, it is created:

>>> df.reset_index(level='class', col_level=1, col_fill='genus')
                genus  speed species
                class    max    type
name
falcon           bird  389.0     fly
parrot           bird   24.0     fly
lion           mammal   80.5     run
monkey         mammal    NaN    jump