Series.reset_index(level_name, drop=True) accepts invalid name when index is flat · Issue #20925 · pandas-dev/pandas (original) (raw)
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) in () ----> 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 (.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) in () ----> 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 (.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