Как исправить: ValueError: Индекс содержит повторяющиеся записи, не может изменить форму


Одна ошибка, с которой вы можете столкнуться при использовании pandas:

ValueError : Index contains duplicate entries, cannot reshape

Эта ошибка обычно возникает, когда вы пытаетесь изменить форму DataFrames pandas с помощью функции pivot () , но в результирующем DataFrame есть несколько значений, которые имеют одни и те же значения индекса.

В следующем примере показано, как исправить эту ошибку на практике.

Как воспроизвести ошибку

Предположим, у нас есть следующие Pandas DataFrame:

import pandas as pd

#create DataFrame
df = pd.DataFrame({'team': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
 'position': ['G', 'G', 'F', 'F', 'G', 'G', 'F', 'F'],
 'points': [5, 7, 7, 9, 4, 9, 9, 12]})

#view DataFrame
df

 team position points
0 A G 5
1 A G 7
2 A F 7
3 A F 9
4 B G 4
5 B G 9
6 B F 9
7 B F 12

Теперь предположим, что мы пытаемся повернуть DataFrame, используя команду в качестве строк и позицию в качестве столбцов:

#attempt to reshape DataFrame
df.pivot(index='team', columns='position', values='points')

ValueError : Index contains duplicate entries, cannot reshape

Мы получаем сообщение об ошибке, потому что в DataFrame есть несколько строк с одинаковыми значениями для команды и позиции .

Таким образом, когда мы пытаемся изменить форму DataFrame, pandas не знает, какое значение точек отображать в каждой ячейке в результирующем DataFrame.

Как исправить ошибку

Чтобы исправить эту ошибку, мы можем использовать функцию pivot_table() с определенным аргументом aggfunc для агрегирования значений данных определенным образом.

Например, мы можем использовать pivot_table() для создания нового DataFrame, который использует команду в качестве строк, позицию в качестве столбцов и сумму значений точек в ячейках DataFrame:

df.pivot_table (index='team', columns='position', values='points', aggfunc='sum')

position F G
team 
A 16 12
B 21 13

Обратите внимание, что на этот раз мы не получаем ошибку.

Значения в DataFrame показывают сумму очков для каждой комбинации команды и позиции .

Обратите внимание, что мы могли бы также использовать другое значение для aggfunc , например, среднее значение:

df.pivot_table (index='team', columns='position', values='points', aggfunc='mean')

position F G
team 
A 8.0 6.0
B 10.5 6.5

Используя аргумент aggfunc в функции pivot_table() , мы можем избежать ошибок.

Примечание. Полную документацию по функции pivot_table() можно найти здесь .

Дополнительные ресурсы

В следующих руководствах объясняется, как исправить другие распространенные ошибки в Python:

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