Подтвердить что ты не робот

Pandas проблемы с распаковкой: ValueError: индекс содержит повторяющиеся записи, не может изменить форму

Я пытаюсь разбить мультииндекс с помощью pandas, и я продолжаю получать:

ValueError: Index contains duplicate entries, cannot reshape

Учитывая набор данных с четырьмя столбцами:

  • id (строка)
  • дата (строка)
  • location (строка)
  • значение (float)

Сначала я установил трехуровневый мультииндекс:

In [37]: e.set_index(['id', 'date', 'location'], inplace=True)

In [38]: e
Out[38]: 
                                    value
id           date       location       
id1          2014-12-12 loc1        16.86
             2014-12-11 loc1        17.18
             2014-12-10 loc1        17.03
             2014-12-09 loc1        17.28

Затем я пытаюсь разложить местоположение:

In [39]: e.unstack('location')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-39-bc1e237a0ed7> in <module>()
----> 1 e.unstack('location')
...
C:\Anaconda\envs\sandbox\lib\site-packages\pandas\core\reshape.pyc in _make_selectors(self)
    143 
    144         if mask.sum() < len(self.index):
--> 145             raise ValueError('Index contains duplicate entries, '
    146                              'cannot reshape')
    147 

ValueError: Index contains duplicate entries, cannot reshape

Что здесь происходит?

4b9b3361

Ответ 1

Вот пример DataFrame, который показывает это, он имеет повторяющиеся значения с одним и тем же индексом. Вопрос в том, хотите ли вы их заполнить или сохранить в виде нескольких строк?

In [11]: df
Out[11]:
   0  1  2      3
0  1  2  a  16.86
1  1  2  a  17.18
2  1  4  a  17.03
3  2  5  b  17.28

In [12]: df.pivot_table(values=3, index=[0, 1], columns=2, aggfunc='mean')  # desired?
Out[12]:
2        a      b
0 1
1 2  17.02    NaN
  4  17.03    NaN
2 5    NaN  17.28

In [13]: df1 = df.set_index([0, 1, 2])

In [14]: df1
Out[14]:
           3
0 1 2
1 2 a  16.86
    a  17.18
  4 a  17.03
2 5 b  17.28

In [15]: df1.unstack(2)
ValueError: Index contains duplicate entries, cannot reshape

Одно решение - reset_index (и вернитесь к df) и используйте pivot_table.

In [16]: df1.reset_index().pivot_table(values=3, index=[0, 1], columns=2, aggfunc='mean')
Out[16]:
2        a      b
0 1
1 2  17.02    NaN
  4  17.03    NaN
2 5    NaN  17.28

Другой вариант (если вы не хотите агрегировать) - добавить фиктивный уровень, отстегнуть его, а затем удалить фиктивный уровень...

Ответ 2

Там гораздо более простое решение для решения этой проблемы.

Причина, по которой вы получаете ValueError: Index contains duplicate entries, cannot reshape, состоит в том, что после того, как вы стяжете "Location", остальные столбцы индекса "id" и "date" больше не уникальны.

Вы можете избежать этого, сохранив столбец индекса по умолчанию (строка #), а при установке индекса используйте "id", "date" и "Location", добавьте его в режим "append" вместо режима перезаписи по умолчанию.

Поэтому используйте

e.set_index(['id', 'date', 'location'], append=True)

Как только это будет сделано, ваши столбцы индекса будут по-прежнему иметь индекс по умолчанию вместе с установленными индексами. И unstack будет работать.

Сообщите мне, как это работает.

Ответ 3

У меня была такая проблема. В моем случае проблема была в данных - моя информация о столбце содержала 1 уникальное значение и вызывала ошибку

ОБНОВЛЕНИЕ: для исправления работы пары "pivot" (id_user, информация) не могут иметь дубликаты

Работает:

df2 = pd.DataFrame({'id_user':[1,2,3,4,4,5,5], 
'information':['phon','phon','phone','phone1','phone','phone1','phone'], 
'value': [1, '01.01.00', '01.02.00', 2, '01.03.00', 3, '01.04.00']})
df2.pivot(index='id_user', columns='information', values='value')

он не работает:

df2 = pd.DataFrame({'id_user':[1,2,3,4,4,5,5], 
'information':['phone','phone','phone','phone','phone','phone','phone'], 
'value': [1, '01.01.00', '01.02.00', 2, '01.03.00', 3, '01.04.00']})
df2.pivot(index='id_user', columns='information', values='value')

источник: fooobar.com/info/180696/...