Estoy recibiendo un ValueError: no se puede reindexar desde un eje duplicado
cuando estoy tratando de establecer un índice a un determinado valor. He intentado reproducirlo con un ejemplo sencillo, pero no he podido hacerlo.
Aquí está mi sesión dentro de ipdb
trace. Tengo un DataFrame con índice de cadena, y columnas enteras, valores de flotación. Sin embargo, cuando intento crear el índice sum
para la suma de todas las columnas me sale el error ValueError: cannot reindex from a duplicate axis
. He creado un pequeño DataFrame con las mismas características, pero no he sido capaz de reproducir el problema, ¿qué podría estar fallando?
No entiendo muy bien qué significa ValueError: cannot reindex from a duplicate axis
, ¿qué significa este mensaje de error? Tal vez esto me ayude a diagnosticar el problema, y esta es la parte más contestada 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
He intentado reproducirlo con un ejemplo sencillo, pero he fallado
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 suele aparecer cuando se une / asigna a una columna cuando el índice tiene valores duplicados. Como estás asignando a una fila, sospecho que hay un valor duplicado en affinity_matrix.columns
, quizás no mostrado en tu pregunta.
Los índices con valores duplicados suelen surgir si se crea un DataFrame concatenando otros DataFrames. Si no le importa preservar los valores de su índice, y quiere que sean valores únicos, cuando concatene los datos, establezca ignore_index=False
.
Alternativamente, para sobrescribir tu índice actual con uno nuevo, en lugar de usar df.reindex()
, establece:
df.index = new_index