J'obtiens un ValueError: cannot reindex from a duplicate axis
lorsque j'essaie de définir un index sur une certaine valeur. J'ai essayé de reproduire cela avec un exemple simple, mais je n'ai pas pu le faire.
Voici ma session à l'intérieur de ipdb
trace. J'ai un DataFrame avec un index de chaîne et des colonnes entières, des valeurs flottantes. Cependant, lorsque j'essaie de créer un sum
index pour la somme de toutes les colonnes, j'obtiens une ValueError: cannot reindex from a duplicate axis
erreur. J'ai créé un petit DataFrame avec les mêmes caractéristiques, mais je n'ai pas pu reproduire le problème, que pourrais-je manquer?
Je ne comprends pas vraiment ce que ValueError: cannot reindex from a duplicate axis
signifie, que signifie ce message d'erreur? Peut-être que cela m'aidera à diagnostiquer le problème, et c'est la partie la plus responsable de ma question.
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
Voici l'erreur:
ipdb> affinity_matrix.loc['sums'] = affinity_matrix.sum(axis=0)
*** ValueError: cannot reindex from a duplicate axis
J'ai essayé de reproduire cela avec un exemple simple, mais j'ai échoué
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
Réponses:
Cette erreur se produit généralement lorsque vous joignez / affectez à une colonne lorsque l'index a des valeurs en double. Puisque vous attribuez à une ligne, je soupçonne qu'il y a une valeur en double dans
affinity_matrix.columns
, peut-être pas montrée dans votre question.la source
affinity_matrix.index
, mais je pense que c'est le même concept.index
signifie les deuxrow
etcolumn names
, j'ai passé 20 minutes sur l'index des lignes, mais il s'est avéré que j'ai obtenu des noms de colonnes en double qui ont causé cette erreur.Comme d'autres l'ont dit, vous avez probablement des valeurs en double dans votre index d'origine. Pour les trouver, procédez comme suit:
df[df.index.duplicated()]
la source
df = df[~df.index.duplicated()]
DatetimeIndex
dataframes ées, vous pouvezresample
à la fréquence désirée, puis prendre.first()
,.mean()
etc.Les indices avec des valeurs en double surviennent souvent si vous créez un DataFrame en concaténant d'autres DataFrames. SI vous ne vous souciez pas de conserver les valeurs de votre index et que vous souhaitez qu'elles soient des valeurs uniques, lorsque vous concaténez les données, définissez
ignore_index=True
.Alternativement, pour remplacer votre index actuel par un nouveau, au lieu d'utiliser
df.reindex()
, définissez:la source
ignore_index=False
c'est la valeur par défaut; si l 'utilisation de l' option consiste à changerappend
le comportement de, cela devra être parce que vous la définissez surTrue
.Pour les personnes qui ont toujours des problèmes avec cette erreur, cela peut également arriver si vous créez accidentellement une colonne en double avec le même nom. Supprimez les colonnes en double comme ceci:
la source
Ignorez simplement l'erreur en utilisant
.values
à la fin.la source
.values
fait l'affaireJe suis tombé sur cette erreur aujourd'hui quand je voulais ajouter une nouvelle colonne comme celle-ci
Je voulais traiter la
REMARK
colonne dedf_temp
pour retourner 1 ou 0. Cependant, j'ai tapé une variable incorrecte avecdf
. Et il a renvoyé une erreur comme celle-ci:Comme vous pouvez le voir, le bon code doit être
Parce que
df
etdf_temp
ont un nombre différent de lignes. Il est donc revenuValueError: cannot reindex from a duplicate axis
.J'espère que vous pourrez le comprendre et ma réponse pourra aider d'autres personnes à déboguer leur code.
la source
Dans mon cas, cette erreur est apparue non pas à cause de valeurs en double, mais parce que j'ai essayé de joindre une série plus courte à un Dataframe: les deux avaient le même index, mais la série avait moins de lignes (il manque les quelques premières). Les éléments suivants ont fonctionné à mes fins:
la source
df_larger_dataframe['values'] = df_filtered_dataframe['filtered_values']
et cela n'a pas fonctionné récemment sur TimeSeries - votre code l'a résolu!J'ai perdu quelques heures sur le même sujet. Dans mon cas, j'ai dû réinitialiser_index () d'une trame de données avant d'utiliser la fonction apply. Avant de fusionner ou de rechercher un autre ensemble de données indexé, vous devez réinitialiser l'index car 1 ensemble de données ne peut avoir qu'un seul index.
la source
Solution simple qui a fonctionné pour moi
Exécutez
df.reset_index(inplace=True)
avant de regrouper.Merci à ce commentaire github pour la solution.
la source