Skip to content

BUG: AssertionError when slicing MultiIndex and setting value of pandas.Series #34870

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
epizzigoni opened this issue Jun 19, 2020 · 1 comment · Fixed by #37513
Closed

BUG: AssertionError when slicing MultiIndex and setting value of pandas.Series #34870

epizzigoni opened this issue Jun 19, 2020 · 1 comment · Fixed by #37513
Labels
Bug Index Related to the Index class or subclasses MultiIndex
Milestone

Comments

@epizzigoni
Copy link
Contributor

Code Sample

>>> import numpy as np
... import pandas as pd
... 
... arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
...           ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
... tuples = list(zip(*arrays))
... index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
... 
... s = pd.Series(np.random.randn(8), index=index)
>>>s
first  second
bar    one      -0.592576
       two      -0.054856
baz    one      -0.169856
       two      -0.712601
foo    one       2.180688
       two      -0.032646
qux    one      -0.729950
       two       0.883029
dtype: float64

>>> s[('baz', 'one'):('foo', 'two')] = 4  # This works!
>>> s
first  second
bar    one      -0.592576
       two      -0.054856
baz    one       4.000000
       two       4.000000
foo    one       4.000000
       two       4.000000
qux    one      -0.729950
       two       0.883029
dtype: float64

>>> s.loc[('baz', 'one'):('foo', 'two')] = 4  # This gives the error!
Traceback (most recent call last):
  File "/Users/edoardo/miniconda3/envs/my37/lib/python3.7/site-packages/pandas/core/indexes/base.py", line 2646, in get_loc
    return self._engine.get_loc(key)
  File "pandas/_libs/index.pyx", line 111, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 138, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1619, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1627, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: ('baz', 'one')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/Users/edoardo/miniconda3/envs/my37/lib/python3.7/site-packages/pandas/core/indexes/multi.py", line 2890, in _get_level_indexer
    start = level_index.get_loc(key.start)
  File "/Users/edoardo/miniconda3/envs/my37/lib/python3.7/site-packages/pandas/core/indexes/base.py", line 2648, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
  File "pandas/_libs/index.pyx", line 111, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 138, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1619, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1627, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: ('baz', 'one')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Users/edoardo/miniconda3/envs/my37/lib/python3.7/site-packages/pandas/core/indexing.py", line 670, in __setitem__
    indexer = self._get_setitem_indexer(key)
  File "/Users/edoardo/miniconda3/envs/my37/lib/python3.7/site-packages/pandas/core/indexing.py", line 641, in _get_setitem_indexer
    return ax.get_loc(key)
  File "/Users/edoardo/miniconda3/envs/my37/lib/python3.7/site-packages/pandas/core/indexes/multi.py", line 2662, in get_loc
    loc = self._get_level_indexer(key, level=0)
  File "/Users/edoardo/miniconda3/envs/my37/lib/python3.7/site-packages/pandas/core/indexes/multi.py", line 2903, in _get_level_indexer
    key.start, key.stop, key.step, kind="loc"
  File "/Users/edoardo/miniconda3/envs/my37/lib/python3.7/site-packages/pandas/core/indexes/base.py", line 4717, in slice_indexer
    raise AssertionError("Start slice bound is non-scalar")
AssertionError: Start slice bound is non-scalar

Problem description

I'm trying to slice and set values of a pandas Series but using the loc function does not work. I can do it by simply using [] and using loc if the Series is first converted into a DataFrame.

Output of pd.show_versions()

INSTALLED VERSIONS

commit : None
python : 3.7.7.final.0
python-bits : 64
OS : Darwin
OS-release : 19.5.0
machine : x86_64
processor : i386
byteorder : little
LC_ALL : None
LANG : None
LOCALE : None.UTF-8
pandas : 1.0.4
numpy : 1.18.1
pytz : 2020.1
dateutil : 2.8.1
pip : 20.1.1
setuptools : 47.3.0.post20200616
Cython : None
pytest : None
hypothesis : None
sphinx : None
blosc : None
feather : None
xlsxwriter : None
lxml.etree : 4.5.0
html5lib : None
pymysql : None
psycopg2 : None
jinja2 : None
IPython : None
pandas_datareader: None
bs4 : 4.9.0
bottleneck : None
fastparquet : None
gcsfs : None
lxml.etree : 4.5.0
matplotlib : 3.1.3
numexpr : None
odfpy : None
openpyxl : None
pandas_gbq : None
pyarrow : None
pytables : None
pytest : None
pyxlsb : None
s3fs : None
scipy : 1.4.1
sqlalchemy : None
tables : None
tabulate : None
xarray : None
xlrd : None
xlwt : None
xlsxwriter : None
numba : None

@epizzigoni epizzigoni added Bug Needs Triage Issue that has not been reviewed by a pandas team member labels Jun 19, 2020
@dsaxton dsaxton added Index Related to the Index class or subclasses MultiIndex and removed Needs Triage Issue that has not been reviewed by a pandas team member labels Jun 24, 2020
@arw2019
Copy link
Member

arw2019 commented Oct 30, 2020

This works on 1.2 master

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug Index Related to the Index class or subclasses MultiIndex
Projects
None yet
4 participants