Recibo un mensaje ValueError: cannot reindex from a duplicate axis
cuando intento establecer un índice en un valor determinado. Traté de reproducir esto con un ejemplo simple, 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 un sum
índice para la suma de todas las columnas, recibo un ValueError: cannot reindex from a duplicate axis
error. Creé un pequeño DataFrame con las mismas características, pero no pude reproducir el problema, ¿qué me podría perder?
Realmente no entiendo qué ValueError: cannot reindex from a duplicate axis
significa, ¿qué significa este mensaje de error? Tal vez esto me ayude a diagnosticar el problema, y esta es la parte más responsable 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
Traté de 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
Respuestas:
Este error generalmente aumenta cuando se une / asigna a una columna cuando el índice tiene valores duplicados. Como está asignando a una fila, sospecho que hay un valor duplicado en
affinity_matrix.columns
, tal vez no se muestra en su pregunta.fuente
affinity_matrix.index
, pero creo que este es el mismo concepto.index
significa ambosrow
ycolumn names
pasé 20 minutos en el índice de la fila, pero resultó que obtuve nombres de columna duplicados que causaron este error.Como han dicho otros, probablemente tenga valores duplicados en su índice original. Para encontrarlos haz esto:
df[df.index.duplicated()]
fuente
df = df[~df.index.duplicated()]
DatetimeIndex
tramas de datos ed, puederesample
que la frecuencia deseada y luego tomar.first()
,.mean()
etc.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()
, establezca:fuente
ignore_index=False
es el valor predeterminado; si usar la opción es cambiarappend
el comportamiento, tendrá que ser porque lo configuró enTrue
.Para las personas que todavía están luchando con este error, también puede suceder si accidentalmente crea una columna duplicada con el mismo nombre. Eliminar columnas duplicadas de esta manera:
fuente
Simplemente omita el error usando
.values
al final.fuente
.values
hizo el trucoMe encontré con este error hoy cuando quería agregar una nueva columna como esta
Quería procesar la
REMARK
columna dedf_temp
para devolver 1 o 0. Sin embargo, escribí una variable incorrecta condf
. Y devolvió un error como este:Como puede ver, el código correcto debería ser
Porque
df
ydf_temp
tiene un número diferente de filas. Entonces regresóValueError: cannot reindex from a duplicate axis
.Espero que lo entiendas y mi respuesta puede ayudar a otras personas a depurar su código.
fuente
En mi caso, este error apareció no debido a valores duplicados, sino porque intenté unir una Serie más corta a un Marco de datos: ambos tenían el mismo índice, pero la Serie tenía menos filas (faltaban las primeras). Lo siguiente funcionó para mis propósitos:
fuente
df_larger_dataframe['values'] = df_filtered_dataframe['filtered_values']
y no ha funcionado últimamente en TimeSeries, ¡su código lo resolvió!Perdí un par de horas en el mismo problema. En mi caso, tuve que reiniciar_index () de un marco de datos antes de usar la función aplicar. Antes de fusionar o buscar desde otro conjunto de datos indexados, debe restablecer el índice ya que 1 conjunto de datos solo puede tener 1 índice.
fuente
Solución simple que funcionó para mí
Ejecutar
df.reset_index(inplace=True)
antes de agrupar.Gracias a este comentario de github por la solución.
fuente