Skip to content

Series.reset_index(level_name, drop=True) accepts invalid name when index is flat #20925

Closed
@toobaz

Description

@toobaz

Code Sample, a copy-pastable example if possible

In [2]: s = pd.Series(range(4))

In [3]: s.reset_index('wrong', drop=True)
Out[3]: 
0    0
1    1
2    2
3    3
dtype: int64

In [4]: s.reset_index('wrong')
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-4-a7b872dfe0cf> in <module>()
----> 1 s.reset_index('wrong')

~/nobackup/repo/pandas/pandas/core/series.py in reset_index(self, level, drop, name, inplace)
   1215         else:
   1216             df = self.to_frame(name)
-> 1217             return df.reset_index(level=level, drop=drop)
   1218 
   1219     def __unicode__(self):

~/nobackup/repo/pandas/pandas/core/frame.py in reset_index(self, level, drop, inplace, col_level, col_fill)
   4098             if not isinstance(level, (tuple, list)):
   4099                 level = [level]
-> 4100             level = [self.index._get_level_number(lev) for lev in level]
   4101             if isinstance(self.index, MultiIndex):
   4102                 if len(level) < self.index.nlevels:

~/nobackup/repo/pandas/pandas/core/frame.py in <listcomp>(.0)
   4098             if not isinstance(level, (tuple, list)):
   4099                 level = [level]
-> 4100             level = [self.index._get_level_number(lev) for lev in level]
   4101             if isinstance(self.index, MultiIndex):
   4102                 if len(level) < self.index.nlevels:

~/nobackup/repo/pandas/pandas/core/indexes/base.py in _get_level_number(self, level)
   1944 
   1945     def _get_level_number(self, level):
-> 1946         self._validate_index_level(level)
   1947         return 0
   1948 

~/nobackup/repo/pandas/pandas/core/indexes/base.py in _validate_index_level(self, level)
   1941         elif level != self.name:
   1942             raise KeyError('Level %s must be same as name (%s)' %
-> 1943                            (level, self.name))
   1944 
   1945     def _get_level_number(self, level):

KeyError: 'Level wrong must be same as name (None)'

In [5]: s = pd.Series(range(4), index=pd.MultiIndex.from_product([[1, 2]]*2))

In [6]: s.reset_index('wrong', drop=True)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~/nobackup/repo/pandas/pandas/core/indexes/multi.py in _get_level_number(self, level)
    775                                  'level number' % level)
--> 776             level = self.names.index(level)
    777         except ValueError:

ValueError: 'wrong' is not in list

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-6-e0d143f488d8> in <module>()
----> 1 s.reset_index('wrong', drop=True)

~/nobackup/repo/pandas/pandas/core/series.py in reset_index(self, level, drop, name, inplace)
   1199                 if not isinstance(level, (tuple, list)):
   1200                     level = [level]
-> 1201                 level = [self.index._get_level_number(lev) for lev in level]
   1202                 if len(level) < len(self.index.levels):
   1203                     new_index = self.index.droplevel(level)

~/nobackup/repo/pandas/pandas/core/series.py in <listcomp>(.0)
   1199                 if not isinstance(level, (tuple, list)):
   1200                     level = [level]
-> 1201                 level = [self.index._get_level_number(lev) for lev in level]
   1202                 if len(level) < len(self.index.levels):
   1203                     new_index = self.index.droplevel(level)

~/nobackup/repo/pandas/pandas/core/indexes/multi.py in _get_level_number(self, level)
    777         except ValueError:
    778             if not isinstance(level, int):
--> 779                 raise KeyError('Level %s not found' % str(level))
    780             elif level < 0:
    781                 level += self.nlevels

KeyError: 'Level wrong not found'

Problem description

In [3]: should raise too.

Expected Output

Same as In [4]:

Output of pd.show_versions()

INSTALLED VERSIONS

commit: None
python: 3.5.3.final.0
python-bits: 64
OS: Linux
OS-release: 4.9.0-6-amd64
machine: x86_64
processor:
byteorder: little
LC_ALL: None
LANG: it_IT.UTF-8
LOCALE: it_IT.UTF-8

pandas: 0.23.0.dev0+825.ga3facfc55
pytest: 3.5.0
pip: 9.0.1
setuptools: 39.0.1
Cython: 0.25.2
numpy: 1.14.1
scipy: 0.19.0
pyarrow: None
xarray: None
IPython: 6.2.1
sphinx: 1.5.6
patsy: 0.5.0
dateutil: 2.7.0
pytz: 2017.2
blosc: None
bottleneck: 1.2.0dev
tables: 3.3.0
numexpr: 2.6.1
feather: 0.3.1
matplotlib: 2.0.0
openpyxl: 2.3.0
xlrd: 1.0.0
xlwt: 1.3.0
xlsxwriter: 0.9.6
lxml: 4.1.1
bs4: 4.5.3
html5lib: 0.999999999
sqlalchemy: 1.0.15
pymysql: None
psycopg2: None
jinja2: 2.10
s3fs: None
fastparquet: None
pandas_gbq: None
pandas_datareader: 0.2.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    Error ReportingIncorrect or improved errors from pandasIndexingRelated to indexing on series/frames, not to indexes themselvesgood first issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions