Поворот в Pandas - ValueError: Индекс содержит повторяющиеся записи, не может изменить форму - PullRequest
0 голосов
/ 03 апреля 2020

Я довольно новичок в python и pandas, и я пытаюсь преобразовать некоторые данные. У меня есть набор данных с тремя столбцами, как показано ниже:

A       B               C
col1    21-03-2019      1.2
col2    21-03-2019      23
col3    21-03-2019      45
col4    21-03-2019      2.4
col5    21-03-2019      78
col1    14-07-2019      0.1
col2    14-07-2019      AM
col3    14-07-2019      CDM
col4    14-07-2019      66
col5    14-07-2019      0.1

Я пытаюсь повернуть кадр данных, используя B в качестве индекса, и сводная таблица работает нормально.

import pandas as pd 

# creating a dataframe 
df = pd.DataFrame({'A': ['col1', 'col2', 'col3', 'col4', 'col5', 'col1', 'col2', 'col3' ,'col4', 'col5'], 
      'B': [21-03-2019,21-03-2019,21-03-2019,21-03-2019,21-03-2019, 14-07-2019,14-07-2019,14-07-2019,14-07-2019,14-07-2019], 
      'C': [1.2, 23, 45, 2.4, 78, 0.1, 'AM', 'CDM', 66, 0.1]}) 

df.pivot(index='B', columns='A', values='C')



A            col1 col2 col3 col4 col5
B                           
21-03-2019  1.2   23   45   2.4   78
14-07-2019  0.1   AM   CDM  66    0.1

Но в моем фрейме данных есть ситуации, когда столбец B одинаков для всех записей, как показано ниже:

A       B               C
col1    21-03-2019      1.2
col2    21-03-2019      23
col3    21-03-2019      45
col4    21-03-2019      2.4
col5    21-03-2019      78
col1    21-03-2019      0.1
col2    21-03-2019      AM
col3    21-03-2019      CDM
col4    21-03-2019      66
col5    21-03-2019      0.1

В этом случае сводка завершается с ошибкой ниже:

ValueError: Index contains duplicate entries, cannot reshape

Я попытался сбросить индекс (хотя я не знаю, что означает сброс индекса) df.pivot(index='B', columns='B', values='C').reset_index('B'), но это все та же ошибка.

Мой ожидаемый результат:

A           col1  col2 col3 col4  col5
B                           
21-03-2019  1.2   23   45   2.4   78
21-03-2019  0.1   AM   CDM  66    0.1

Как я могу решить это? Может кто-нибудь, пожалуйста, помогите мне?

1 Ответ

2 голосов
/ 03 апреля 2020

Если для каждой группы существует col1 и это возможно сначала, создайте вспомогательный столбец g, сравнив значения по Series.eq и совокупной сумме Series.cumsum:

df['g'] = df['A'].eq('col1').cumsum()

И затем для решения без агрегации используйте DataFrame.set_index с Series.unstack:

df1 = df.set_index(['B', 'g', 'A'])['C'].unstack()

Или для агрегирования по первому значению возможно использование DataFrame.pivot_table:

df1 = df.pivot_table(index=['B', 'g'], columns='A', values='C', aggfunc='first')
print (df1)
A            col1 col2 col3 col4 col5
B          g                         
21-03-2019 1  1.2   23   45  2.4   78
           2  0.1   AM  CDM   66  0.1

Последнее возможно удалить помощник level of MultiIndex:

df1 = df1.reset_index(level=1, drop=True)
print (df1)
A          col1 col2 col3 col4 col5
B                                  
21-03-2019  1.2   23   45  2.4   78
21-03-2019  0.1   AM  CDM   66  0.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...