Skip to content

BUG: 1.4.0rc1 AssertionError when reset_index drops all indexes except for an empty RangeIndex. #45230

Closed
@TheNeuralBit

Description

@TheNeuralBit

Pandas version checks

  • I have checked that this issue has not already been reported.

  • I have confirmed this bug exists on the latest version of pandas.

  • I have confirmed this bug exists on the master branch of pandas.

Reproducible Example

In [73]: df = pd.DataFrame(columns=['brand'], dtype=np.int64, index=pd.RangeIndex(0,0,1))

In [74]: df = df.set_index([df.index, 'brand'])

In [75]: list(df.index.levels)
Out[75]: 
[RangeIndex(start=0, stop=0, step=1),
 Int64Index([], dtype='int64', name='brand')]

In [76]: df.reset_index([1], drop=True)
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-76-863d90e52ed0> in <module>
----> 1 df.reset_index([1], drop=True)

~/.pyenv/versions/3.8.6/envs/beam/lib/python3.8/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
    309                     stacklevel=stacklevel,
    310                 )
--> 311             return func(*args, **kwargs)
    312 
    313         return wrapper

~/.pyenv/versions/3.8.6/envs/beam/lib/python3.8/site-packages/pandas/core/frame.py in reset_index(self, level, drop, inplace, col_level, col_fill)
   5789             level = [self.index._get_level_number(lev) for lev in level]
   5790             if len(level) < self.index.nlevels:
-> 5791                 new_index = self.index.droplevel(level)
   5792 
   5793         if not drop:

~/.pyenv/versions/3.8.6/envs/beam/lib/python3.8/site-packages/pandas/core/indexes/base.py in droplevel(self, level)
   2048         levnums = sorted(self._get_level_number(lev) for lev in level)[::-1]
   2049 
-> 2050         return self._drop_level_numbers(levnums)
   2051 
   2052     @final

~/.pyenv/versions/3.8.6/envs/beam/lib/python3.8/site-packages/pandas/core/indexes/base.py in _drop_level_numbers(self, levnums)
   2081                 # If lev is empty, lev.take will fail GH#42055
   2082                 res_values = algos.take(lev._values, new_codes[0], allow_fill=True)
-> 2083                 result = type(lev)._simple_new(res_values, name=new_names[0])
   2084             else:
   2085                 # set nan if needed

~/.pyenv/versions/3.8.6/envs/beam/lib/python3.8/site-packages/pandas/core/indexes/range.py in _simple_new(cls, values, name)
    169         result = object.__new__(cls)
    170 
--> 171         assert isinstance(values, range)
    172 
    173         result._range = values

AssertionError:

Issue Description

This very specific use-case (dropping an index using reset_index s.t. only a RangeIndex remains) is failing the assertion here:

assert isinstance(values, range)

I've only observed this behavior in 1.4.0rc1. I've verified this code works fine in previous pandas versions, but I haven't tested with master.

Expected Behavior

Pandas should drop index 1 and retain index 0 without raising an error.

Installed Versions

1.4.0rc1

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugReshapingConcat, Merge/Join, Stack/Unstack, Explode

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions