¿Qué significa "ValueError: no se puede reindexar desde un eje duplicado"?
Recibo un mensaje ValueError: cannot reindex from a duplicate axis
cuando 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 ipdb
trace. Tengo un DataFrame con índice de cadena y columnas enteras, valores flotantes. Sin embargo, cuando intento crear sum
un índice para la suma de todas las columnas, aparece ValueError: cannot reindex from a duplicate axis
un 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 axis
significa, ¿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
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.
Como han dicho otros, probablemente tenga valores duplicados en su índice original. Para encontrarlos haz esto:
df[df.index.duplicated()]
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