Проблема мультииндексных данных в Pandas при назначении новой строки (могу ли я использовать .loc?) - ValueError и KeyError - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь добавить новую строку в существующий мультииндексный фрейм данных.Когда я пытаюсь сделать это, я получаю ValueError: не могу обработать неуникальный мультииндекс!Однако, когда я пытаюсь прочитать тот же индекс, я получаю KeyError, показывающую, что индекс не существует (и поэтому должен быть уникальным?).

df.loc[('shntswt_40465_1__22',50.0),variables] = values[:-1]
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    df.loc[('shntswt_40465_1__22',50.0),variables] = values[:-1]
  File "C:\Python37\lib\site-packages\pandas\core\indexing.py", line 190, in __setitem__
    self._setitem_with_indexer(indexer, value)
  File "C:\Python37\lib\site-packages\pandas\core\indexing.py", line 376, in _setitem_with_indexer
    self.obj._data = self.obj.reindex(labels, axis=i)._data
  File "C:\Python37\lib\site-packages\pandas\util\_decorators.py", line 197, in wrapper
    return func(*args, **kwargs)
  File "C:\Python37\lib\site-packages\pandas\core\frame.py", line 3809, in reindex
    return super(DataFrame, self).reindex(**kwargs)
  File "C:\Python37\lib\site-packages\pandas\core\generic.py", line 4356, in reindex
    fill_value, copy).__finalize__(self)
  File "C:\Python37\lib\site-packages\pandas\core\frame.py", line 3741, in _reindex_axes
    fill_value, limit, tolerance)
  File "C:\Python37\lib\site-packages\pandas\core\frame.py", line 3749, in _reindex_index
    tolerance=tolerance)
  File "C:\Python37\lib\site-packages\pandas\core\indexes\multi.py", line 2227, in reindex
    raise ValueError("cannot handle a non-unique multi-index!")
ValueError: cannot handle a non-unique multi-index!
df.loc[('shntswt_40465_1__22',50.0),variables]
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    df.loc[('shntswt_40465_1__22',50.0),variables]
  File "C:\Python37\lib\site-packages\pandas\core\indexing.py", line 1494, in __getitem__
    return self._getitem_tuple(key)
  File "C:\Python37\lib\site-packages\pandas\core\indexing.py", line 868, in _getitem_tuple
    return self._getitem_lowerdim(tup)
  File "C:\Python37\lib\site-packages\pandas\core\indexing.py", line 969, in _getitem_lowerdim
    return self._getitem_nested_tuple(tup)
  File "C:\Python37\lib\site-packages\pandas\core\indexing.py", line 1048, in _getitem_nested_tuple
    obj = getattr(obj, self.name)._getitem_axis(key, axis=axis)
  File "C:\Python37\lib\site-packages\pandas\core\indexing.py", line 1913, in _getitem_axis
    return self._get_label(key, axis=axis)
  File "C:\Python37\lib\site-packages\pandas\core\indexing.py", line 141, in _get_label
    return self.obj._xs(label, axis=axis)
  File "C:\Python37\lib\site-packages\pandas\core\generic.py", line 3583, in xs
    drop_level=drop_level)
  File "C:\Python37\lib\site-packages\pandas\core\indexes\multi.py", line 2542, in get_loc_level
    return partial_selection(key)
  File "C:\Python37\lib\site-packages\pandas\core\indexes\multi.py", line 2532, in partial_selection
    indexer = self.get_loc(key)
  File "C:\Python37\lib\site-packages\pandas\core\indexes\multi.py", line 2418, in get_loc
    raise KeyError(key)
KeyError: ('shntswt_40465_1__22', 50.0)

Однако я могу получить и присвоитьв существующую строку.

df.loc[('trf_91000_91005_1',50.0)]
                        m:R  m:X  m:Z m:phiz
Contingency       Freq                      
trf_91000_91005_1 50.0  NaN  NaN  NaN    NaN
df.loc[('trf_91000_91005_1',50.0),variables] = values[:-1]
df.loc[('trf_91000_91005_1',50.0)]
                            m:R      m:X      m:Z   m:phiz
Contingency       Freq                                    
trf_91000_91005_1 50.0  2.85944  10.5443  10.9252  74.8273

Я вполне уверен, что ранее я создал новые многоиндексные записи с помощью .loc, но я не вижу, в чем я ошибаюсь.

...