Pandas DataFrame не будет вращаться. Говорит дубликаты индексов - PullRequest
0 голосов
/ 14 апреля 2020

Таким образом, в основном у меня есть три столбца в моем фрейме данных следующим образом:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 158143 entries, 0 to 203270
Data columns (total 3 columns):
 #   Column         Non-Null Count   Dtype         
---  ------         --------------   -----         
 0   users          158143 non-null  int64         
 1   dates          158143 non-null  datetime64[ns]
 2   medium_of_ans  158143 non-null  object

И я хочу, чтобы он был изменен таким образом, чтобы каждая запись в значении medium_of_ans имела отдельный столбец и датировалась как индексы строки с пользователями конкретный носитель ответов на определенную дату находится в соединении этой строки и столбца В pandas аналогичная функциональность может быть достигнута путем поворота фрейма данных, хотя я не могу добиться этого при следующей попытке:

df.pivot(columns= 'medium_of_ans', index = 'dates', values = 'users')

выдает эту ошибку:

ValueError: Index contains duplicate entries, cannot reshape

И я ' Я не уверен, почему в качестве поворотного кадра данных, очевидно, будут дубликаты индексов. Вот почему это разворачивается. Сброс индекса фрейма данных выполняется следующим образом:

df.reset_index().pivot(columns= 'medium_of_ans', index = 'dates', values = 'users')

тоже не помогает и ошибка сохраняется.

1 Ответ

1 голос
/ 14 апреля 2020

У вас есть дубликаты не только по индексу, dates, но и по комбинации индекса и столбца вместе, объединенные dates и medium_of_ans.

Вы можете найти эти дубликаты с чем-то вроде this:

counts = df.groupby(['dates', 'medium_of_ans']).size().reset_index(name='n')
duplicates = counts[counts['n'] > 1]

Если вы хотите объединить дубликаты, например, взяв среднее значение users для ячейки, тогда вы можете использовать pivot_table .

df.pivot_table(columns='medium_of_ans', index='dates', values='users', aggfunc='mean')

Значение по умолчанию используется по умолчанию, но для ясности я добавил явный параметр.

...