¿Qué significa "ValueError: no se puede reindexar desde un eje duplicado"?

Resuelto Akavall asked hace 9 años • 18 respuestas

Recibo un mensaje ValueError: cannot reindex from a duplicate axiscuando intento establecer un índice en un valor determinado. Intenté reproducir esto con un ejemplo sencillo, pero no pude hacerlo.

Aquí está mi sesión dentro de ipdbtrace. Tengo un DataFrame con índice de cadena y columnas enteras, valores flotantes. Sin embargo, cuando intento crear sumun índice para la suma de todas las columnas, aparece ValueError: cannot reindex from a duplicate axisun error. Creé un pequeño DataFrame con las mismas características, pero no logré reproducir el problema, ¿qué me podría faltar?

Realmente no entiendo lo que ValueError: cannot reindex from a duplicate axissignifica, ¿qué significa este mensaje de error? Quizás esto me ayude a diagnosticar el problema y esta es la parte más respondible de mi pregunta.

ipdb> type(affinity_matrix)
<class 'pandas.core.frame.DataFrame'>
ipdb> affinity_matrix.shape
(333, 10)
ipdb> affinity_matrix.columns
Int64Index([9315684, 9315597, 9316591, 9320520, 9321163, 9320615, 9321187, 9319487, 9319467, 9320484], dtype='int64')
ipdb> affinity_matrix.index
Index([u'001', u'002', u'003', u'004', u'005', u'008', u'009', u'010', u'011', u'014', u'015', u'016', u'018', u'020', u'021', u'022', u'024', u'025', u'026', u'027', u'028', u'029', u'030', u'032', u'033', u'034', u'035', u'036', u'039', u'040', u'041', u'042', u'043', u'044', u'045', u'047', u'047', u'048', u'050', u'053', u'054', u'055', u'056', u'057', u'058', u'059', u'060', u'061', u'062', u'063', u'065', u'067', u'068', u'069', u'070', u'071', u'072', u'073', u'074', u'075', u'076', u'077', u'078', u'080', u'082', u'083', u'084', u'085', u'086', u'089', u'090', u'091', u'092', u'093', u'094', u'095', u'096', u'097', u'098', u'100', u'101', u'103', u'104', u'105', u'106', u'107', u'108', u'109', u'110', u'111', u'112', u'113', u'114', u'115', u'116', u'117', u'118', u'119', u'121', u'122', ...], dtype='object')

ipdb> affinity_matrix.values.dtype
dtype('float64')
ipdb> 'sums' in affinity_matrix.index
False

Aquí está el error:

ipdb> affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0)
*** ValueError: cannot reindex from a duplicate axis

Intenté reproducir esto con un ejemplo simple, pero fallé.

In [32]: import pandas as pd

In [33]: import numpy as np

In [34]: a = np.arange(35).reshape(5,7)

In [35]: df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], range(10, 17))

In [36]: df.values.dtype
Out[36]: dtype('int64')

In [37]: df.loc['sums'] = df.sum(axis=0)

In [38]: df
Out[38]: 
      10  11  12  13  14  15   16
x      0   1   2   3   4   5    6
y      7   8   9  10  11  12   13
u     14  15  16  17  18  19   20
z     21  22  23  24  25  26   27
w     28  29  30  31  32  33   34
sums  70  75  80  85  90  95  100
Akavall avatar Dec 02 '14 03:12 Akavall
Aceptado

Este error generalmente surge cuando unes/asignas a una columna cuando el índice tiene valores duplicados. Dado que está asignando a una fila, sospecho que hay un valor duplicado affinity_matrix.columns, tal vez no se muestra en su pregunta.

tktk avatar Dec 02 '2014 05:12 tktk

Como han dicho otros, probablemente tenga valores duplicados en su índice original. Para encontrarlos haz esto:

df[df.index.duplicated()]

Matthew avatar Jun 06 '2016 10:06 Matthew

Los índices con valores duplicados a menudo surgen si crea un DataFrame concatenando otros DataFrames. SI no le importa preservar los valores de su índice y desea que sean valores únicos, cuando concatene los datos, establezca ignore_index=True.

Alternativamente, para sobrescribir su índice actual con uno nuevo, en lugar de usar df.reindex(), configure:

df.index = new_index
Rebeku avatar Sep 07 '2017 15:09 Rebeku